【问题标题】:Can epoll_wait() > 1 with only 1 socket and 1 event -- EPOLLIN?epoll_wait() > 1 是否只有 1 个套接字和 1 个事件——EPOLLIN?
【发布时间】:2013-08-12 08:06:45
【问题描述】:

假设我 epoll_create1() 并且只对 EPOLLIN 感兴趣 | 1 个插座的 EPOLLET。

我是否有可能为该套接字获得 epoll_wait() > 1(假设 timeout=-1)并且事件是 EPOLLIN?

或者即使有多个数据包,epoll_wait() 也会返回 1(假设分散在几秒钟内,我在 epoll_wait 循环中故意暂停程序)?

提前致谢。

【问题讨论】:

  • 对于边缘触发模式,您必须特别小心地为每个触发的事件类型耗尽文件描述符,否则您将看不到未来的事件。

标签: c++ c linux epollet


【解决方案1】:

epoll_wait 返回事件的数量,根据文档,它等于“准备好用于 I/O 的文件描述符的数量”。所以你不能得到比你注册的文件描述符数量更多的事件。

【讨论】:

  • 如果套接字已经准备好一些数据然后断开连接,epoll_wait() 将首先返回 1 且 event=EPOLLIN,然后下一个 epoll_wait() 将返回 1 且 event=EPOLLRDHUP?换句话说,epoll_wait() 不会为同一个文件描述符返回 2 而是 2 个不同的事件?
  • @Hei:好问题。也许see this question。手册说事件是组合的,所以也许你应该检查可读性以及 hup。
【解决方案2】:

根据epoll_wait 的这些文档,它应该返回“就绪”的 fd 的数量。如果你只传入一个 fd,那么你不应该得到超过 1 个返回 - 这肯定是 epoll_wait 实现中的一个错误,并且它已经存在了一段时间,所以我希望它经过了很好的测试(除非你是正在开发全新的架构或 C 库的 beta 版本等)。

另外,超时 = 0,而不是 -1。

【讨论】:

  • 谢谢。 timeout=-1 表示阻塞,timeout=0 表示非阻塞 :)
猜你喜欢
  • 2014-09-29
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2013-10-10
  • 2017-03-01
  • 2016-10-11
  • 2019-06-07
  • 1970-01-01
相关资源
最近更新 更多