来自epoll的手册页:
epoll is a variant of poll(2) that can be used either as an edge-triggered
or a level-triggered interface
何时使用边缘触发选项?手册页给出了一个使用它的示例,但我不明白为什么在示例中有必要。
答案 0 :(得分:94)
当FD变为读或写时,您可能不一定想立即读取(或写入)所有数据。
只要FD保持准备好,等级触发的epoll就会一直唠叨你,而边缘触发不会再打扰你,直到你下次获得EAGAIN
时(因此编码更复杂,但根据你的需要,可以更有效率。)
假设您正在从资源写入FD。如果您注册了您对FD的兴趣,请将其写入级别触发,您将不断收到FD已准备好写入的通知。如果资源尚未可用,那就是浪费醒来,因为无论如何你都不能再写了。
如果您要将其添加为边缘触发,则会收到FD准备就绪一次的通知,然后当其他资源准备就绪时,您可以尽可能多地写入。然后,如果write(2)
返回EAGAIN
,您就会停止撰写并等待下一个通知。
这同样适用于阅读,因为您可能不希望在准备好做任何想做的事情之前将所有数据都拉到用户空间(因此必须缓冲它等等)。使用边缘触发的epoll,当它准备好阅读时,你会被告知,然后可以记住它,并在“当时和”时进行实际阅读。
答案 1 :(得分:6)
在我的实验中,ET并不保证只有一个线程会被唤醒,尽管它通常只唤醒一个线程。 EPOLLONESHOT标志就是为了这个目的。