2
  1. 进程 B 在管道上进行 epoll (EPOLLIN|EPOLLET)。
  2. 进程 A 在管道中写入 1KiB。
  3. 进程 B 唤醒。
  4. 进程 B 从管道中读取 1KiB。
  5. 进程 A 在管道中写入 1KiB。
  6. 进程 B 在管道上进行 epoll。

管道的状态在 epoll 期间没有改变,但自上次读取后发生了变化。进程B会再次唤醒吗?

4

2 回答 2

1

我从http://linux.die.net/man/4/epoll中的常见问题解答(Q9)的理解是,您将在第 6 步中得到另一个事件(假设您可以保证第 5 步确实发生在第 4 步之后,并且步骤 4) 后管道为空。

话虽如此,您可能会获得比保证更多的事件(但您必须小心仅依赖记录的行为) - 请参阅http://cmeerw.org/blog/753.html#753http://cmeerw.org /blog/750.html#750

于 2014-03-18T08:43:26.680 回答
1

虽然内核确实在第 6 步唤醒,但这不是手册页中记录的内容。您提供的用例不符合EPOLLET应该如何使用。

根据文档,第 6 步应该是“从 FD 读取”。您应该从 FD 进行轮询的唯一时间是在您尝试阅读并获得EAGAIN.

另请参阅:EPOLLET 的用例是什么?

于 2020-10-18T08:28:38.457 回答