epoll邊緣觸發 Epoll筆記

2021-10-12 19:49:16 字數 853 閱讀 6096

下圖為epoll的流程圖:

epoll一共兩種模式,水平觸發(lt)和邊緣觸發(et),主要的區別在於對讀,寫資料的處理:

//lt初始化

epoll_ctrl(connect_socket, epollin, add);

​// lt讀

void lt_handle_read()

if (n < 0 && errno == eagain) }​

// lt寫

void lt_handle_write()

if (write_left == 0)

if (n < 0 && errno == eagain)

}//et初始化

epoll_ctrl(connect_socket, epollet | epollin | epollout, add);

​// et讀

void et_handle_read()

if (n < 0 && errno == eagain) }​

// et寫

void et_handle_write()

if (n < 0 && errno == eagain)

}

於是總結出兩種模式的優缺點:

epoll的邊緣觸發

level triggered 水平觸發 當被監控的檔案描述符上有可讀寫事件發生時,epoll wait 會通知處理程式去讀寫。如果這次沒有把資料一次性全部讀寫完 如讀寫緩衝區太小 那麼下次呼叫 epoll wait 時,它還會通知你在上沒讀寫完的檔案描述符上繼續讀寫,當然如果你一直不去讀寫,它會一...

epoll 水平觸發 邊緣觸發

水平觸發 只要緩衝區還有資料,核心就還會通知使用者。使用者如果第一次讀取資料沒讀完,即使沒有任何新的操作觸發,還是可以繼續通過epoll wait來獲取事件 邊緣觸發 只有當新事件觸發的時候,才能通過epoll wait來獲取資料,如果第一次讀取資料沒讀完,就只能等待下一次事件觸發來獲取餘下的資料。...

epoll 水平觸發 邊緣觸發

先簡單比較一下level trigger 和 edge trigger 模式的不同。讓我們換乙個角度來理解et模式,事實上,epoll的et模式其實就是socket io完全狀態機。當socket由不可讀變成可讀時,epoll的et模式返回read 事件。對於read 事件,開發者需要保證把讀取緩衝...