對於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次