水平觸發:當被監控的檔案描述符上有可讀寫的時間發生時,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多路復用中的水平觸發模式和...