问题标签 [kevent]
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.
c - 当被信号中断时,kevent 是否会丢弃更改列表?
当kevent
返回时EINTR
,这很可能发生,因为它不支持SA_RESTART
行为,是否应用了更改列表?
我得到了它的印象,因为信号EINTR
仅在线程进入睡眠状态后生成,这仅在应用更改列表后发生。正确的?
c - 带有 kqueue 的 TCP 服务器工作者
我最近对内核事件进行了一些测试,结果如下:
使用内核事件来接受套接字是否有意义?我的测试表明我一次只能处理一个接受(即使事件列表数组更大)(对我来说很有意义,因为 .ident == sockfd 仅适用于一个套接字)。
我以为kevent的使用主要是一次从多个socket中读取。真的吗?
这是 TCP 服务器如何使用 kqueue 实现完成的吗?:
- 监听线程(无 kqueue)
- 接受新连接并将 FD 添加到 worker kqueue。 问题:这甚至可能吗?我的测试显示是的,但它是否保证工作线程会知道这些更改并且 kevent 真的是线程安全的?
工作线程(带 kqueue)
- 等待对从侦听线程添加的文件描述符的读取。
问题:一次检查更新有多少个套接字有意义?
谢谢
python - Mac OSX 上的 Tornado + kevent
我最近遇到了在 Mac OSX Yosemite 上运行龙卷风的问题。向龙卷风服务器发出请求时,我得到以下回溯:
最后一行是最重要的。我相当肯定这只是因为缺少 brew 包,但我不知道我会缺少什么。
更神奇的是,我可以导入 select 并看到 kevent 函数存在。
macos - kevent & USB serial ports
I'm having trouble using kevent on mac with a USB serial console. I've narrowed it down to:
When I run this and unplug the USB device in the middle of the call to kevent(), I get:
My understanding is that the contents of the event translates to:
FD 4, EVFILT_READ, EV_ADD, 6 bytes remaining on fd. But the ioctl() fails (since the device was removed), and errno is also 6, so it seems as if event.data is returning the errno, not the bytes remaining.
How can I differentiate between the normal read case and the case where the device has been removed? The filter, flags & fflags appear the same in both cases.
Additional Information
If I switch from opening the serial console to a pipe, and write a single byte followed by closing the write end, I get:
This is what I expect, since 0x8000 is EV_EOF.
c - libcurl 与 macOS Sierra 上的 kevent 异步集成
我正在将 curl 集成到基于 kqueue 的异步 I/O 事件循环中。
libcurl 有一个优秀的 API 用于集成到应用程序事件循环中。
您为 libcurl 提供了两个回调,一个用于设置计时器(用于限制请求/连接时间),另一个用于为读/写/错误事件注册 libcurl 的文件描述符。
用于执行 FD 注册的回调的文档在这里:CURLMOPT_SOCKETFUNCTION
通知回调 libcurl 感兴趣的事件的参数有四个枚举值:
尽管没有明确记录,libcurl 期望在后续调用回调时,更新事件循环的过滤器状态以匹配它传递的内容。即,如果在第一次调用时它通过了CURL_POLL_IN
(EVFILT_READ
),而在随后的调用中它通过了CURL_POLL_OUT
(EVFILT_WRITE
),那么原始EVFILT_READ
过滤器将被删除。
我更新了 FD 注册码来处理这个问题。
不幸的是,它不起作用。kevent 似乎没有删除旧的过滤器(我们继续收到他们的通知)。
更奇怪的是,如果我在两个单独的调用中应用这两个操作,它工作得很好。
这是 Sierra 的 kevent 实现中的错误,还是我误解了 kevent 应该如何工作?
c - 当文件描述符关闭时,有什么方法可以执行回调(在 Linux 上)
我正在为 Linux 开发一个kevent/kqueue 仿真库。我是这个项目的新维护者,不幸的是,以前的维护者不再参与太多(所以我不能动脑筋)。
在 FreeBSD 和 macOS 下,当您close()
提供的文件描述符kqeueue()
释放任何与其关联的资源和事件时。
现有代码似乎没有提供类似的接口。在我向 API 添加一个函数(或恢复一个旧函数)以显式释放 kqueue 资源之前,我想知道是否有任何方法可以将触发器与 linux 中的文件描述符相关联,这样当它关闭时,我们可以清理与FD。
文件描述符本身可以是任何类型,即由 eventfd 提供的类型,或 epoll 或任何其他创建文件描述符的类型。
nonblocking - “特殊” epoll 标志如何对应 kqueue 标志?
我正在努力在 epoll 和 kqueue 标志之间画一个平行线,特别是EPOLLONESHOT EPOLLET EPOLLEXCLUSIVE
和 EV_CLEAR/EV_DISPATCH/EV_ONESHOT。我是第一次调查kqueue;我只有epoll的经验。
EV_DISPATCH
感觉就像 EPOLLEXCLUSIVE 和 EPOLLONESHOT 标志的混合;来自 kqueue 文档:
如果至少有一个 kqueue 实例轮询此事件,我是否正确理解该事件已发出信号然后立即丢弃的文档?也就是说,如果我们在两个 kqueue 上轮询 EVFILT_READ 的套接字,只有一个会接收到它,然后,直到使用 EVFILT_ENABLE 设置相同的事件,即使有新数据到达套接字,也不会再有任何进一步的事件?
EV_CLEAR
看起来离EPOLLET很近;来自 kqueue 文档:
因此,例如,给定带有 EVFILT_READ 的相同套接字,所有同时轮询它的 kqueue 都将使用 EVFILT_READ 唤醒。但是,如果不是所有数据都被读取(即直到 EAGAIN),则不会报告更多事件。当且仅当所有数据都被读取并且新数据到达时,才会触发新的 EVFILT_READ 事件。这是对的吗?
EV_ONESHOT
看起来它映射到 EPOLLONESHOT;来自 kqueue 文档:
问题
所以,问题:
- 我的理解正确吗?与 epoll 相比,我是否正确理解了这些特殊标志?文档对我来说似乎有点棘手;可能问题是我之前只用过epoll,还没有玩过kqueue。
- 您能否提供好的资源或示例来查看 kqueue 技术?如果它不像 Boost.Asio 那样复杂,那就太好了;这些源代码也可以用 C 语言编写。
- 这些标志可以组合在一起吗?例如,EPOLLONESHOT 不能与 EPOLLEXCLUSIVE 组合,但 EV_DISPATCH 似乎恰好位于这些标志之间。
谢谢您的帮助!
参考
macos - macOS 使用 kevents 监控新的分叉进程
EVFILT_PROC
我正在尝试通过使用pid来监视所有使用 Kevents 新创建的进程,launchd
pid 为 1:
当我无法检索新进程 PID 或名称创建新进程时,我确实收到了事件:
有没有人遇到过这个?
谢谢!