我在网上找到的关于嵌套FD行为的信息非常有限。
假设EPOLLFD1在EPOLL FD2和FD3之间共享。那么如果 epoll FD1 得到一个事件
会发生什么- 如果在没有标志的情况下添加事件epoll_exclusive它是否会向 FD2 和 Fd3 引发事件。
- 获得事件后,我是否需要在FD1上执行epoll_wait以清除事件。
嵌套 epoll FD 的用例是什么。
对于关卡触发的情况,非常简单:
- 是的,你可以将 epoll(7) 手册页中 Q&A 部分的 Q2 和 Q3 答案结合起来
:如果将相同的文件描述符添加到两个 epoll 实例中,则会向这两个实例报告事件。
A3:如果 epoll 文件描述符有事件在等待,那么它将指示为可读。 - 否,因为清除事件仅与边缘触发的 epoll 相关。
对于边缘触发的情况,我们希望 1 的答案保持不变,因为无论嵌套如何,如果将相同的 FD 添加到两个 epoll 实例EPOLLET
,它们都将报告每个事件一次。
我不知道第二个问题的答案应该是什么,但没关系。在边缘触发模式下添加 epoll FD 时存在一个错误,它们的行为始终像级别触发一样,FD2 和 FD3 将继续显示 FD1 是可读的,只要它有挂起的事件。 您可以看到有关尝试修复它的线程,我认为尚未向大陆提出: FS/epoll:修复了嵌套 epoll
的边缘触发模式,该模式链接到此 GitHub 存储库,该存储库测试了许多不同的场景,您可能会觉得有趣。