水平和邊緣觸發實戰

2021-08-14 11:49:33 字數 2295 閱讀 1149

水平觸發:當被監控的檔案描述符上有可讀寫的時間發生時,epoll_wait會通知處理程式去讀寫,如果你沒有讀寫完,下次epoll_wait就會再直通知你。

垂直觸發:當被監控的檔案描述符上有可讀寫時間發生時,epoll_wait會通知處理程式去讀寫,如果你沒有讀寫玩,下次epoll_wait就不會在通知你。

水平觸發:ev.events = epollin        垂直觸發: ev.events = epollin|epollet;//垂直觸發 

服務端:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxline 4096

#define backlog 100

int main()

ev.data.fd = iconnsock;

= epollin|epollet;//垂直觸發

ev.events = epollin;//水平觸發

epoll_ctl(epollfd, epoll_ctl_add, iconnsock, &ev); // 將ev和對應的iconnsock新增到epoll控制代碼,用於被epollfd管理

printf("new sock came, fd is %d\n", iconnsock);

}

else

; //使得每次唯讀乙個位元組的資料

int recvlen = recv(iconnsock, szbuf, sizeof(szbuf) - 1, 0);

if (recvlen > 0)

else if(0 == recvlen)

else

}

}

close(epollfd);

close(ilistensock);

return 0;

}

客戶端:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int main()  

先執行服務端,再執行客戶端。服務端每次接受乙個位元組的資料,水平觸發的服務端結果如下:

[mapan@localhost io]$ ./server 

nfds is 1

new sock came, fd is 5

nfds is 1

recv data [1] from fd [5]

nfds is 1

recv data [2] from fd [5]

nfds is 1

recv data [3] from fd [5]

nfds is 1

recv data [4] from fd [5]

nfds is 1

recv data [5] from fd [5]

nfds is 1

recv data [6] from fd [5]

nfds is 1

recv data [7] from fd [5]

nfds is 1

recv data [8] from fd [5]

nfds is 1

recv data [9] from fd [5]

nfds is 1

recv data [0] from fd [5]

服務端對客戶端發來資料分10次接收了,epoll_wait返回了10次也就接收了10次。

注釋**中的水平觸發那一行,解開對垂直觸發那行的注釋,客戶端不變,編譯執行。垂直觸發的服務端結果如下:

[mapan@localhost io]$ ./server 

nfds is 1

new sock came, fd is 5

nfds is 1

recv data [1] from fd [5]

垂直觸發只接收了客戶端發來的第乙個位元組,並沒有接收完,就不接收了。

還是**結果一目了然。

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多路復用中的水平觸發模式和...