我正在努力在 epoll 和 kqueue 标志之间画一个平行线,特别是EPOLLONESHOT EPOLLET EPOLLEXCLUSIVE
和 EV_CLEAR/EV_DISPATCH/EV_ONESHOT。我是第一次调查kqueue;我只有epoll的经验。
EV_DISPATCH
感觉就像 EPOLLEXCLUSIVE 和 EPOLLONESHOT 标志的混合;来自 kqueue 文档:
EV_DISPATCH Disable the event source immediately after delivery of an
event. See EV_DISABLE above.
EV_DISABLE Disable the event so kevent() will not return it. The fil-
ter itself is not disabled.
如果至少有一个 kqueue 实例轮询此事件,我是否正确理解该事件已发出信号然后立即丢弃的文档?也就是说,如果我们在两个 kqueue 上轮询 EVFILT_READ 的套接字,只有一个会接收到它,然后,直到使用 EVFILT_ENABLE 设置相同的事件,即使有新数据到达套接字,也不会再有任何进一步的事件?
EV_CLEAR
看起来离EPOLLET很近;来自 kqueue 文档:
EV_CLEAR After the event is retrieved by the user, its state is
reset. This is useful for filters which report state tran-
sitions instead of the current state. Note that some fil-
ters may automatically set this flag internally.
因此,例如,给定带有 EVFILT_READ 的相同套接字,所有同时轮询它的 kqueue 都将使用 EVFILT_READ 唤醒。但是,如果不是所有数据都被读取(即直到 EAGAIN),则不会报告更多事件。当且仅当所有数据都被读取并且新数据到达时,才会触发新的 EVFILT_READ 事件。这是对的吗?
EV_ONESHOT
看起来它映射到 EPOLLONESHOT;来自 kqueue 文档:
EV_ONESHOT Causes the event to return only the first occurrence of the
filter being triggered. After the user retrieves the event
from the kqueue, it is deleted.
问题
所以,问题:
- 我的理解正确吗?与 epoll 相比,我是否正确理解了这些特殊标志?文档对我来说似乎有点棘手;可能问题是我之前只用过epoll,还没有玩过kqueue。
- 您能否提供好的资源或示例来查看 kqueue 技术?如果它不像 Boost.Asio 那样复杂,那就太好了;这些源代码也可以用 C 语言编写。
- 这些标志可以组合在一起吗?例如,EPOLLONESHOT 不能与 EPOLLEXCLUSIVE 组合,但 EV_DISPATCH 似乎恰好位于这些标志之间。
谢谢您的帮助!
参考