gpt4 book ai didi

nonblocking - "special"epoll 标志如何对应于 kqueue 标志?

转载 作者:行者123 更新时间:2023-12-05 05:15:15 28 4
gpt4 key购买 nike

我正在努力在 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 System Calls Manual

epoll(7): Linux Programmer's Manual

epoll_ctl(7): Linux Programmer's Manual

最佳答案

  1. EV_CLEAR 不等于 EPOLLET,例如某些监听套接字有 5 个挂起的连接,并且您不会消耗所有这些连接(accept 直到 EAGAIN),然后使用 EV_CLEAR,您就赢了在第 6 个连接出现之前,不会从 kevent 获取 EVFILT_READ 事件。

  2. EPOLLEXCLUSIVE用于CPU绑定(bind),与EV_DISPATCH无关。

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

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

  5. EV_ONESHOT 几乎等于EPOLLONESHOT,在不同线程需要调用相同kqueue的kevent时很有用

关于nonblocking - "special"epoll 标志如何对应于 kqueue 标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51793399/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com