首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一击*级别*-触发epoll():EPOLLONESHOT是否意味着EPOLLET?

一击*级别*-触发epoll():EPOLLONESHOT是否意味着EPOLLET?
EN

Stack Overflow用户
提问于 2016-08-26 19:24:41
回答 2查看 2.1K关注 0票数 6

是否可以在一次触发模式下使用epoll

我在搜索时找不到任何信息,似乎每个人都使用边缘触发模式。

EN

回答 2

Stack Overflow用户

发布于 2017-09-10 16:31:20

如果选择了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来测试它。
票数 9
EN

Stack Overflow用户

发布于 2017-01-29 02:04:21

如果希望epoll停止监听套接字,则应该使用EPOLLONESHOT。如果确实使用EPOLLONESHOT,则必须在该套接字上的epoll信号之后将套接字添加回epoll。因此,EPOLLONESHOT不是EPOLLET。您可以在没有EPOLLET的情况下使用EPOLLONESHOT,但是它可能没有效率。如果使用这两个标志,则必须使用非阻塞套接字,并且只向epoll添加一个套接字一次recv,并发送带有EAGAIN错误的返回。详情请参阅手册页。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39173429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档