epoll 误区

对于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次
    无论sock缓冲是否读完,只要对方有send或connect或cloase或强退,就会触发EPOLLIN

LT模式:只要socket可读,就会一直触发EPOLLIN

EPOLLOUT
ET模式:
    每次EPOLL_CTL_ADD或EPOLL_CTL_MOD时,若是加入前,就是可写状态,那么加入后会触发1次
    若是EPOLLOUT与EPOLLIN一块儿注册,无论sock发送缓冲是否从满变不满,只要socket发送是不满的,那么每次EPOLLIN触发时,都会触发EPOLLOUT

LT模式:只要socket可写,就会一直触发EPOLLOUT


简单来讲,ET模式下,只要监听了EPOLLIN和EPOLLOUT,socket的每次动做(包括close与不close直接强退),都会触发1次, 与读写缓冲的状态无关。 EPOLLHUP     每次有未链接的socket被加入监听列队时,会触发EPOLLHUP     好比socket建立了套接字之后未调用connect或未调用listen,就直接加入epoll监听列队     或者close了之后再加入epoll监听列队
相关文章
相关标签/搜索