指定EPOLLONESHOT时,电平触发和边沿触发模式有什么区别?
已经有一个类似的问题here。 “蹲伏小猫”的答案似乎并不正确(据我所知,其他答案没有回答我的问题)。
我尝试了以下方法:
epoll_wait
epoll_wait
返回,然后读取1个字节。 epoll_wait
。在这里,对于两种情况(LT和ET),epoll_wait
都不会等待,而是立即返回(与“Crouching Kitten”的回答相反)指定EPOLLONESHOT时,LT和ET有什么区别吗?
最佳答案
我认为最基本的答案是“没有区别”。
查看the code,似乎fd在一次被禁用之前会记住最后的设置位。它记得那是一枪,也记得那是不是ET。
这是徒劳的,因为fd在修改之前被禁用,并且对EPOLL_CTL_MOD
的下一次调用将擦除所有这些,并用新MOD所说的替换。
话虽如此,我不明白为什么有人会同时想要EPOLLET
和EPOLLONESHOT
。对我来说,EPOLLET
的全部意义在于,在某些编程模型(即微线程)下,它完全遵循语义。这意味着我可以从一开始就将fd添加到epoll,然后再也不必执行其他与epoll相关的系统调用。
另一方面,想要对何时监视fd以及何时监视fd进行严格控制的人们使用EPOLLONESHOT
。根据定义,这与EPOLLET
的使用相反。我只是认为这两者在概念上不兼容。
关于linux - epoll : difference between level triggered and edge triggered when EPOLLONESHOT specified,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46621209/