- 进程 B 在管道上进行 epoll (EPOLLIN|EPOLLET)。
- 进程 A 在管道中写入 1KiB。
- 进程 B 唤醒。
- 进程 B 从管道中读取 1KiB。
- 进程 A 在管道中写入 1KiB。
- 进程 B 在管道上进行 epoll。
管道的状态在 epoll 期间没有改变,但自上次读取后发生了变化。进程B会再次唤醒吗?
我从http://linux.die.net/man/4/epoll中的常见问题解答(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
.
另请参阅:EPOLLET 的用例是什么?