3

我正在努力在 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.

问题

所以,问题:

  1. 我的理解正确吗?与 epoll 相比,我是否正确理解了这些特殊标志?文档对我来说似乎有点棘手;可能问题是我之前只用过epoll,还没有玩过kqueue。
  2. 您能否提供好的资源或示例来查看 kqueue 技术?如果它不像 Boost.Asio 那样复杂,那就太好了;这些源代码也可以用 C 语言编写。
  3. 这些标志可以组合在一起吗?例如,EPOLLONESHOT 不能与 EPOLLEXCLUSIVE 组合,但 EV_DISPATCH 似乎恰好位于这些标志之间。

谢谢您的帮助!

参考

kqueue(2): FreeBSD 系统调用手册

epoll(7):Linux 程序员手册

epoll_ctl(7):Linux 程序员手册

4

1 回答 1

1
  1. EV_CLEAR不等于EPOLLET,例如,某些监听套接字有 5 个待处理连接,并且您不会消耗所有连接(accept直到EAGAIN),然后使用,直到第 6 个连接出现EV_CLEAR,您才会收到EVFILT_READ事件。kevent

  2. EPOLLEXCLUSIVE用于 CPU 绑定,与EV_DISPATCH.

  3. EV_ONESHOTknote表示在特定事件触发后删除,而EV_DISPATCH仅禁用它。

  4. 如果一个socket fd注册到多个kqueue,那么在触发事件的同时广播事件。

  5. EV_ONESHOT几乎等于,这在不同线程需要使用相同的 kqueue fdEPOLLONESHOT调用的情况下很有用。kevent

于 2018-12-28T12:49:46.890 回答