epoll的兩種模式 LT ET

2021-10-10 16:56:27 字數 2372 閱讀 9872

關於epoll的兩種工作模式:lt(level trigger,電平觸發)模式、et(edge trigger,邊沿觸發) 模式。

et模式在很大程度上降低了同乙個 epoll 事件被重複觸發的次數

用以下**測試 lt、et在工作方式上的差異。

#include #include #include #include #include #include #include #include #include #include #include #include #include #define max_event_number 1024

#define buffer_size 10

// 將檔案描述符設定成非阻塞的

int setnonblocking( int fd )

// enable_et 引數指定是否對fd啟用et模式

void addfd( int epollfd, int fd, bool enable_et )

epoll_ctl( epollfd, epoll_ctl_add, fd, &event );

setnonblocking( fd );

}void lt( epoll_event* events, int number, int epollfd, int listenfd )

else if ( events[i].events & epollin )

printf( "get %d bytes of content: %s\n", ret, buf );

}else

}}void et( epoll_event* events, int number, int epollfd, int listenfd )

// 不會被重複觸發,迴圈讀取資料

else if ( events[i].events & epollin )

close( sockfd );

break;

}else if( ret == 0 )

else}}

else

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

int port = atoi(ar**[1]);

int ret = 0;

sockaddr_in address;

bzero(&address, sizeof(address));

address.sin_family = af_inet;

if (argc >= 3)

else

address.sin_port = htons(port);

int listenfd = socket(pf_inet, sock_stream, 0);

assert(listenfd >= 0);

ret = bind(listenfd, (sockaddr*)&address, sizeof(address));

assert(ret != - 1);

ret = listen(listenfd, 5);

assert(ret != -1);

epoll_event events[max_event_number];

int epollfd = epoll_create(5);

assert(epollfd != -1);

addfd(epollfd, listenfd, true);

while(true)

lt(events, ret, epollfd, listenfd); // 使用 lt模式

//et(events, ret, epollfd, listenfd); // 使用 et模式

}close(listenfd);

return 0;

}

執行 ./epoll_test 12888 並在另乙個視窗用telnet輸入超過10個(buffersize)字元:

在伺服器端得到:

換成et模式:執行伺服器後,telnet客戶端輸入:

伺服器顯示:

epoll兩種模式(lt et)複習

最近又在複習一些基礎知識,現在看看epoll的相關知識點。兩種模式 簡單理解 lt 水平觸發 對於採用lt工作模式的檔案描述符,當epoll wait檢測到其上有事件發生並將此事件通知應用程式後,應用程式可以不立即處理該事件,當應用程式下一次呼叫epoll wait時,epoll waite還會再次...

epoll的兩種工作模式LT ET

之前已經介紹過了epoll的工作機制,以及它和select,poll之間的區別,傳送門 接下來我們詳細介紹一下它的兩種工作模式。lt level triggered lt模式,也叫做水平觸發模式。在該模式下,當有事件發生並呼叫epoll wait後,若未及時處理,下一次呼叫epoll wait仍會繼...

EPOLL兩種模式

select epoll 的特點 select 的特點 select 選擇控制代碼的時候,是遍歷所有控制代碼,也就是說控制代碼有事件響應時,select 需要遍歷所有控制代碼才能獲取到哪些控制代碼有事件通知,因此效率是非常低。但是如果連線很少的情況下,select 和epoll的lt 觸發模式相比,...