關於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 觸發模式相比,...