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