人epoll:
The suggested way to use epoll as an edge-triggered (EPOLLET) interface is as follows:
i with nonblocking file descriptors; and
ii by waiting for an event only after read(2) or write(2) return EAGAIN.
想象一下我们有两个 fd:第一个是被动的,数据仅有时可用,第二个是主动的,数据有时不可用。
epoll_wait 返回我们可以读取两者。我们在循环中读取{第一个,而不是第二个}(没有调用 epoll_wait 因为它可能会在数据仍然可用时突然阻塞)。
现在第一个文件描述符在读取时返回 EAGAIN。
该怎么办?
- 如果我们继续在循环中读取第二个 fd(不调用 epoll_wait),我们可能会错过第一个 fd 上的数据可用。它只会在没有 EAGAIN 的情况下阅读和阅读。
- 如果我们在每次从第二个 fd 读取之前“咨询” epoll_wait,则 epoll_wait 可能会因为前一次调用没有任何更改而突然阻塞(数据在第一个 FD 上仍然不可用,但在第二个 FD 上仍然可用)。
如何继续处理第二个 FD,但又不会忘记第一个 FD?
更新:又发现了一件事:man epoll_wait:
while specifying timeout equal to zero makes epoll_wait() to return immediately even if no events are available
有了这个,即使没有事件,我也可以枚举 FD 的事件。