指定EPOLLONESHOT时,电平触发和边沿触发模式有什么区别?

已经有一个类似的问题here。 “蹲伏小猫”的答案似乎并不正确(据我所知,其他答案没有回答我的问题)。

我尝试了以下方法:

  • 服务器向客户端发送2个字节,而客户端等待epoll_wait
  • 客户端从epoll_wait返回,然后读取1个字节。
  • 客户端重新布防事件(由于EPOLLONESHOT)
  • 客户端再次调用epoll_wait。在这里,对于两种情况(LT和ET),epoll_wait都不会等待,而是立即返回(与“Crouching Kitten”的回答相反)
  • 客户端可以读取第二个字节

  • 指定EPOLLONESHOT时,LT和ET有什么区别吗?

    最佳答案

    我认为最基本的答案是“没有区别”。

    查看the code,似乎fd在一次被禁用之前会记住最后的设置位。它记得那是一枪,也记得那是不是ET。

    这是徒劳的,因为fd在修改之前被禁用,并且对EPOLL_CTL_MOD的下一次调用将擦除所有这些,并用新MOD所说的替换。

    话虽如此,我不明白为什么有人会同时想要EPOLLETEPOLLONESHOT。对我来说,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/

    10-12 17:35