问题标签 [kqueue]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
227 浏览

libevent - 如何让 libwebsockets 在内部使用 kqueue() 系统调用而不是 _poll()?

到目前为止:1-我有一个使用 libwebsocket 服务器与浏览器(websockets 客户端)通信的本机应用程序。2- 当应用程序连接到 websockets 客户端时,我看到 CPU 使用率很高(活动监视器指示 4 核 mac 机器 - Yosemite(10.10.4) 中的 100% 使用率),我们看到函数 _poll() 正在使用75% CPU:使用 Time Profiler 应用程序看到。3-因此,我将libwebsockets配置为使用libev,希望libev在内部使用kqueue,从而降低cpu利用率[按照此链接中提到的步骤:https ://github.com/warmcat/libwebsockets/blob/e800db52bd0b42285b56d32a20f6d0d142571a89/changelog向下滚动到 v1.3-chrome37-firefox30 -> 用户 api 添加]

但仍然:我看到 libwebsockets 正在使用 _poll() 函数。

如果我错过了什么,谁能告诉我。我的最终目标是看到 libwebsockets 工作 - 在内部使用 kqueue 并检查它是否会降低 CPU 利用率。

0 投票
1 回答
469 浏览

macos - kqueue 的 EV_RECEIPT 到底是干什么用的?

kqueue 机制有一个事件标志,根据EV_RECEIPT链接的手册页:

... 对于在不耗尽任何未决事件的情况下对 kqueue 进行批量更改很有用。当作为输入传递时,它强制EV_ERROR总是被返回。成功添加过滤器后,数据字段将为零。

然而,我的理解是,在不耗尽任何未决事件的情况下对 kqueue 进行批量更改是微不足道的,只需将nevents参数传递给 0kevent并因此从队列中不提取任何事件。考虑到这一点,为什么有EV_RECEIPT必要?

苹果 OS X 文档中的一些示例代码实际上使用了 EV_RECEIPT:

但是,由于changes在调用后从未检查过数组kevent,我完全不清楚为什么EV_RECEIPT在这种情况下使用。

EV_RECEIPT 真的有必要吗?在什么情况下它真的有用?

0 投票
1 回答
1221 浏览

linux - 如何正确等待事件/过程完成不是父母?

我正在使用GO来检查一个进程(不是父进程)是否已终止,基本上类似于FreeBSD中的pwait命令,但用 go 编写。

目前我正在尝试 a for loopkill -0但我注意到这种方法的 CPU 使用率非常高99%,这里是代码:

关于如何改进或正确实施这一点的任何想法。

提前致谢。

更新

sleep像建议的那样在循环中添加一个有助于减少负载。

从提供的链接来看,似乎可以附加到现有的 pid,我会尝试PtraceAttach但不知道这是否有副作用,有什么想法吗?

正如建议的那样,我可以使用kqueue

工作正常,但想知道如何在 linux 上实现/实现相同的功能,因为我认为kqueue它不可用,有什么想法吗?

0 投票
1 回答
1484 浏览

c - Kqueue(边缘触发):短读是否意味着读准备丢失?

当在边缘触发模式 ( ) 下使用Linux epollEPOLLET时,读/写失败并带有EAGAIN/ ,这意味着读/写准备丢失,并且一旦EWOULDBLOCK准备就绪,就会保证新的准备事件可用epoll_wait()恢复。

此外,当在边缘触发模式下使用Linux epoll和非阻塞流模式套接字时,如果我们注册了对事件的兴趣EPOLLRDHUP,并且EPOLLRDHUP尚未收到事件,则短读/写(返回值小于请求的大小) 也意味着读/写准备的丢失,当重新准备就绪时,我们仍然可以依赖新的准备通知,即使没有读/写因EAGAIN/失败EWOULDBLOCK

类似地,当在边缘触发模式(一旦恢复准备就绪。EV_CLEAREAGAINEWOULDBLOCKkevent()

问题:在边缘触发模式下使用Kqueue和非阻塞流模式套接字时,如果我们注册了对事件的兴趣EV_EOF,并且EV_EOF尚未收到事件,是否有类似的保证,即短读/写意味着失去读/写准备,并且当重新准备就绪时保证会产生新的准备事件?

编辑:注意:知道短读意味着失去读准备允许我(在一般情况下)避免冗余调用read()只是为了获得EAGAIN/EWOULDBLOCK失败。

Linux epoll 上下文中短读/写的含义来自epoll(7) 手册页中的此注释:

对于面向流的文件(如管道、FIFO、流套接字),也可以通过检查目标文件描述符读/写的数据量来检测读/写I/O空间耗尽的情况。例如,如果您通过请求读取一定数量的数据来调用 read(2),而 read(2) 返回的字节数较少,则可以确定文件描述符的读取 I/O 空间已用尽。使用 write(2) 写入时也是如此。(如果你不能保证被监控的文件描述符总是指向一个面向流的文件,请避免使用后一种技术。)

0 投票
1 回答
504 浏览

macos-sierra - 在 macOS Sierra 上运行 Crystal 时出现损坏的 kqueue 警告

我决定尝试使用 Crystal 来检查它相对于 Ruby 的速度和兼容性。我将预构建的 .pkg 安装程序下载到我的 macOS Sierra 系统中。我的小型测试程序似乎正在运行,但都产生以下消息:

我怀疑与 Sierra 不兼容,或者库过时或丢失。有人知道修复是什么吗?这很烦人,但它也有潜在的危险吗?

0 投票
0 回答
137 浏览

macos - OSX 使用 FSevents 或内核队列来捕获打开的不存在文件

我想构建一个用户空间工具来监视任何尝试打开具有特定路径+名称的不存在文件(它不会出现在文件系统中)。

查看可用选项,最接近我需要的选项是使用 kevent 框架。

这是一个由 表示的监视文件的示例path,它需要文件描述符。如果由于文件不存在而失败,也许有一个选项可以监视对path事件的每次访问。open

0 投票
1 回答
432 浏览

python - 对于使用 requests.Session() 发送发布请求的范围,它会警告“模块”对象没有属性“kqueue”

macOS 10.12.3 python 2.7.13 requests 2.13.0
我使用请求包发送发布请求。此请求需要在发布数据之前登录。所以我使用 request.Session() 并加载登录的 cookie。然后我使用这个会话以循环模式发送帖子数据。
我曾经在 Windows 和 Linux 中运行此代码并没有错误。
简单代码:

但是程序经常(大约每个间隔)崩溃,错误是AttributeError: 'module' object has no attribute 'kqueue'

0 投票
1 回答
1425 浏览

c++ - 了解 TCP 中的 kqueue

我正在关注关于 kqueue 的教程(特别是http://eradman.com/posts/kqueue-tcp.htmlhttps://wiki.netbsd.org/tutorials/kqueue_tutorial/),并且有些部分我不明白。这是我的(编辑过的)代码:

我不明白:

  1. 我是否正确设置 nevents = BACKLOG 即并发连接数?如果不是,那应该是什么?

  2. 我为什么要检查event_list[i].flags & EV_EOF?我最好的猜测是,如果套接字在队列中时连接失败,那么我想从队列中删除那个套接字?但是为什么我又打电话给 kevent 呢?

  3. 在与前一点相同的部分中,我调用close(fd). 那是对的吗?埃拉德曼教程有一些额外的巫术,但我不明白为什么。

  4. 如果我理解正确,当我准备好阅读部分消息时,kqueue 可能会返回。我怎么知道消息何时完成?

如果它是相关的,我正在使用 OS X。

0 投票
1 回答
745 浏览

c - Mac OS 和 FreeBSD 之间对 fifos 的 kqueue 处理有何不同?

我正在开发一个将 fifos 用于 IPC 并使用事件通知 API(例如 epoll 或 kqueue)来监视 fifos 以获取要读取的数据的应用程序。

应用程序期望,如果 fifo 的写入器终止,读取器将通过事件通知 API 接收事件,从而允许读取器注意到写入器终止。

我目前正在将此应用程序移植到 macos,并且我在使用 kqueue 时遇到了一些奇怪的行为。我已经能够创建这种行为的复制器:

这个复制器派生了一个子进程,它创建了 2 个 fifo:/tmp/parent-$CHILD_PID/tmp/child-$CHILD_PID. 父级等待直到/tmp/parent-$CHILD_PID被创建,然后向其写入一个字节。子进程打开/tmp/parent-$CHILD_PID并阻塞以读取父进程写入的字节。完成后,子进程通过 将相同的字节写入父进程/tmp/child-$CHILD_PID。父级使用 kqueue 来观察写入/tmp/child-$CHILD_PID

这一系列事件运行良好。

当孩子关闭其引用的文件时,就会出现此问题/tmp/child-$CHILD_PID。我看到此事件未通过 kqueue 报告给父级。

最有趣的部分:这段代码在 FreeBSD 上可以正常工作。

版本信息:

Mac OS X: 10.11.6

FreeBSD 10.4-RELEASE-p3

在这种情况下,macos 和 FreeBSD 上的 kqueue 有区别吗?如果是这样,是否有一些文档记录了这种差异?

0 投票
1 回答
159 浏览

ruby - Kqueue dirextended 看什么动作?

我在 OS X 上玩rb-kqueue,但我不知道如何让extend标志触发。

OpenBSD kqueue 手册页(也与 OS X 手册页匹配):

NOTE_EXTEND 描述符引用的文件被扩展

这是非常循环的。

FreeBSD kqueue 手册页有:

NOTE_EXTEND 对于常规文件,描述符引用的文件被扩展。对于目录,报告作为重命名操作的结果添加或删除了目录条目。在目录内更改名称时不会报告 NOTE_EXTEND 事件。

这更具描述性,但是,我一直在目录上运行 kqueue 并尝试我可能无法触发扩展标志。我试过mv, rename, (因为搜索“扩展”会返回很多关于扩展属性的结果),使用and和重定向xattr添加子目录和文件,但没有任何结果导致标志成为事件的一部分,只是和/或。mkdirtouchextendwritelink

因此,我对extend真正的东西感到困惑。仅仅是因为我在 OS X 上运行它吗?