【发布时间】:2014-04-23 06:05:39
【问题描述】:
- 管道上的进程 B epoll (EPOLLIN|EPOLLET)。
- 进程 A 在管道中写入 1KiB。
- 进程 B 唤醒。
- 进程 B 从管道中读取 1KiB。
- 进程 A 在管道中写入 1KiB。
- 管道上的进程 B epoll。
管道的状态在 epoll 期间没有改变,但自上次读取后发生了变化。进程 B 会再次唤醒吗?
【问题讨论】:
标签: linux sockets epoll epollet
管道的状态在 epoll 期间没有改变,但自上次读取后发生了变化。进程 B 会再次唤醒吗?
【问题讨论】:
标签: linux sockets epoll epollet
我从http://linux.die.net/man/4/epoll的FAQ(Q9)的理解是,你会在第6步得到另一个事件(假设你可以保证第5步真的发生在第4步之后并且管道在第4步之后是空的)。
话虽如此,您可能会得到比保证更多的事件(但您必须小心仅依赖记录在案的行为) - 请参阅 http://cmeerw.org/blog/753.html#753 和 http://cmeerw.org/blog/750.html#750
【讨论】:
虽然内核确实在第 6 步唤醒,但手册页中并未记录。您提供的用例不符合 EPOLLET 的使用方式。
根据文档,第 6 步应该是“从 FD 读取”。您应该从 FD 进行轮询的唯一时间是在您尝试阅读并获得 EAGAIN 之后。
【讨论】: