epoll的邊緣觸發

2021-10-14 23:12:00 字數 1406 閱讀 6704

level_triggered(水平觸發):當被監控的檔案描述符上有可讀寫事件發生時,epoll_wait()會通知處理程式去讀寫。如果這次沒有把資料一次性全部讀寫完(如讀寫緩衝區太小),那麼下次呼叫 epoll_wait()時,它還會通知你在上沒讀寫完的檔案描述符上繼續讀寫,當然如果你一直不去讀寫,它會一直通知你!!!如果系統中有大量你不需要讀寫的就緒檔案描述符,而它們每次都會返回,這樣會大大降低處理程式檢索自己關心的就緒檔案描述符的效率!!!

edge_triggered(邊緣觸發):當被監控的檔案描述符上有可讀寫事件發生時,epoll_wait()會通知處理程式去讀寫。如果這次沒有把資料全部讀寫完(如讀寫緩衝區太小),那麼下次呼叫epoll_wait()時,它不會通知你,也就是它只會通知你一次,直到該檔案描述符上出現第二次可讀寫事件才會通知你!!!這種模式比水平觸發效率高,系統不會充斥大量你不關心的就緒檔案描述符!!

#include #include #include #include #include #include #include #include #define max_buff_size 4

#define epoll_size 64

void handlerror(char* msg)

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

if(listen(sock, 5))

struct epoll_event *pevent =

(struct epoll_event *)malloc(sizeof(epoll_event) * epoll_size);

struct epoll_event event;

event.data.fd = sock;

event.events = epollin;

int epfd = epoll_create(epoll_size);

if(epoll_ctl(epfd, epoll_ctl_add, sock, &event))

socklen_t socklen = sizeof(sockadr);

char message[max_buff_size] = ;

while (true)

if (0 == cnt) continue;

for (int i = 0; i < cnt; i++)

} else

printf("recv :%s\n", message);

// echo

if(-1 == write(sockclnt, message, sizeof(message)))

memset(message, 0, sizeof(message));}}

}close(epfd);

close(sock);

return 0;

}

epoll邊緣觸發 Epoll筆記

下圖為epoll的流程圖 epoll一共兩種模式,水平觸發 lt 和邊緣觸發 et 主要的區別在於對讀,寫資料的處理 lt初始化 epoll ctrl connect socket,epollin,add lt讀 void lt handle read if n 0 errno eagain lt寫...

epoll 水平觸發 邊緣觸發

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

epoll 水平觸發 邊緣觸發

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