对于epoll的网上一大抄的太多,而其中对ET模式的描述基本都是不许确的 编程
如下是被抄袭最多的部分,而对于ET的误区就在这里 socket
EPOLL事件分发系统能够运转在两种模式下:Edge Triggered (ET)、Level Triggered (LT)。
LT是缺省的工做方式,而且同时支持block和no-block socket;在这种作法中,内核告诉你一个文件描述符是否就绪了,而后你能够对这个就绪的fd进行IO操做。若是你不做任何操做,内核仍是会继续通知你 的,因此,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的表明。
spa
ET是高速工做方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核经过epoll告诉你。而后它会假设你知道文件描述符已经就绪,而且不会再为那个文件描述 符发送更多的就绪通知,直到你作了某些操做致使那个文件描述符再也不为就绪状态了。可是请注意,若是一直不对这个fd做IO操做(从而致使它再次变成未就 绪),内核不会发送更多的通知。 事件
按照以上描述ET模式下,好比EPOLLIN事件到达,若是你不recv直到返回错误,那么以后有数据到达,系统不会再通知你。但事实上并非这样,某些时候系统仍是会通知你的,下面对Epoll事件触发时机作个总结 select
EPOLLIN 总结
ET模式: 数据
每次EPOLL_CTL_ADD或EPOLL_CTL_MOD时,若是加入前,就是可读状态,那么加入后会触发1次