linux C epoll 水平觸發與邊緣觸發詳解

2021-09-24 21:41:27 字數 612 閱讀 2842

poll有兩種觸發方式

水平觸發與邊緣觸發的區別:

水平觸發:只要緩衝區有資料就會一直觸發

邊沿觸發:只有在緩衝區增加資料的那一刻才會觸發

/* 使用邊沿觸發 */

#include #include #include #include #include int main(int argc, char *ar**)}}

return 0;

}

以上程式對於水平觸發的情況下,只要終端輸入資料,就會一直列印hello world

對於邊緣觸發,當終端輸入一行, 只會列印一次hello world

在設定邊緣觸發時,因為每次發訊息只會觸發一次(不管快取區是否還留有資料),所以必須把資料一次性讀取出來,否則會影響下一次訊息

下面的**實現的是監聽檔案描述符,每次固定讀取5個位元組

先看下面這段**

int main(int argc, char *ar**)

printf("hello world\n");}}

}return 0;

}

epoll 水平觸發 邊緣觸發

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

epoll 水平觸發 邊緣觸發

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

水平觸發與邊緣觸發

今天開始封裝c的socket的基礎,在封裝的時候意識到這樣乙個問題,如果我現在fd的接收緩衝區中有2048位元組的資料,但是我唯讀出來1024個位元組的資料,當我下次select的時候 這之間沒有網路資料過來 還會檢測到該select可讀嗎?這樣就引申出來水linux的io多路復用中的水平觸發模式和...