一次性*level*触发的epoll():EPOLLONESHOT是否意味着EPOLLET?

2024-03-25

是否可以使用epoll一击level- 触发模式?
我在搜索时没有找到任何相关信息;看来每个人都使用边缘触发模式。


当。。。的时候EPOLLONESHOT标记被选中并且您已经为套接字提取了一个事件,那么该套接字不会像许多人想象的那样从 epoll 中删除,但它的事件会被禁用。您可以使用再次启用它们epoll_ctl / EPOLL_CTL_MOD.

一个示例情况,当EPOLLONESHOT当您将可用数据从套接字读取到缓冲区时,这种行为会很方便。该缓冲区将被独立清空,但在它不为空之前,您必须禁用套接字事件,即使套接字有其他数据。然后在缓冲区被使用并清空后,您可以重新启用套接字。

仅当您重新启用套接字时,边缘触发和电平触发的“一次性”行为之间的差异才会出现。一个例子:

  1. 套接字接收 7K 数据(目前存储在内核缓冲区中)
  2. 您等待输入事件,然后套接字事件由于 EPOLLONESHOT 而被禁用。
  3. 您将 4K 读入应用程序级缓冲区。
  4. 随后应用程序缓冲区被使用并清空。您可以使用以下命令重新启用套接字epoll_ctl / EPOLL_CTL_MOD.

电平触发的 EPOLLONESHOT:

  1. 由于内核缓冲区中仍然存在 3K 数据,因此该事件会再次触发。

边沿触发 EPOLLONESHOT:

  1. 它不会再次针对可用数据触发事件。您必须通过阅读并等待来测试它EAGAIN / EWOULDBLOCK.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一次性*level*触发的epoll():EPOLLONESHOT是否意味着EPOLLET? 的相关文章

随机推荐