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監聽列隊
相關文章
相關標籤/搜索