1. 程式人生 > >聊聊epoll的水平觸發和邊緣觸發

聊聊epoll的水平觸發和邊緣觸發

一句話總結:水平觸發下epoll_wait在檔案描述符沒有讀寫完會一直觸發,而邊緣觸發是可讀寫時觸發一次。

類別

情況

水平觸發的非阻塞監聽sockfd

高併發情況下,fd一個一個取,不會漏掉

邊緣觸發的非阻塞監聽sockfd

高併發情況下可能會有漏掉的情況

水平觸發的阻塞連線connfd

資料一次沒有取完,會一直觸發直到取完

水平觸發的非阻塞連線connfd

資料一次沒有取完,會一直觸發直到取完

邊緣觸發的阻塞連線connfd

如果不一次性讀完,沒讀完的資料在下一次邊緣觸發時會被讀出來;如果用迴圈讀,讀完資料會阻塞在recv

邊緣觸發的非阻塞

連線connfd

如果不一次性讀完,沒讀完的資料在下一次邊緣觸發時會被讀出來;需一次性讀完,快取不夠就用迴圈讀


說明:

1、以上沒有驗證阻塞的監聽sockfd,因為socket連線與accept無關,epoll_wait()返回必定是已就緒的連線,設不設定阻塞accept()都會立即返回。不考慮socket連線後在accept之前又斷開導致accept阻塞的情況

2、監聽socket最好是水平觸發

3、連線socket水平觸發模式下建議是非阻塞

4、連線socket邊緣觸發模式下必須用非阻塞,資料一次性讀完不要干擾下次的資料