Linux中epoll的LT、ET模式
阿新 • • 發佈:2021-02-11
技術標籤:Linux C++
LT、ET模式:
epoll 對檔案描述符的操作有兩種模式: LT( Level Trigger, 電平觸發) 模式和ET( Edge Trigger, 邊沿觸發)模式。 LT 模式是預設的工作 模式, 這種模式下 epoll 相當於一個效率較高的 poll。 當往 epoll 核心事件表中註冊一個檔案描述符上的 EPOLLET 事件 時, epoll 將以 ET 模式來操作該檔案描述符。 ET 模式是 epoll 的高效工作模式。
對比兩種模式 中epoll_wait執行次數、都設定非阻塞 socket、buf 設定大小 10
int main( int argc, char* argv[] ) { /*設定 socket、epoll等*/ if( argc <= 2 ) { printf( "usage: %s ip_address port_number\n", basename( argv[0] ) ); return 1; } const char* ip = argv[1]; int port = atoi( argv[2] ); int ret = 0; struct sockaddr_in address; bzero( &address, sizeof( address ) ); address.sin_family = AF_INET; inet_pton( AF_INET, ip, &address.sin_addr ); address.sin_port = htons( port ); int listenfd = socket( PF_INET, SOCK_STREAM, 0 ); assert( listenfd >= 0 ); ret = bind( listenfd, ( struct 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 ); /**/ int run_size = 0; while( 1 ) { int ret = epoll_wait( epollfd, events, MAX_EVENT_NUMBER, -1 ); if ( ret < 0 ) { printf( "epoll failure\n" ); break; } run_size++; printf("epoll_wait執行次數: %d\n",run_size); lt( events, ret, epollfd, listenfd ); //et( events, ret, epollfd, listenfd ); } /* close();等操作*/ close( listenfd ); return 0; }
在程式 採取 LT執行時:
event trgger once 是在 epoll中 sockfd 為EPOLLIN時觸發:
在 客戶端執行連線後觸發 迴圈次數:1;
迴圈次數:2 出現時為我在客戶端輸入 12345678912 後。
在程式 採取 ET執行時:
在 客戶端執行連線後觸發 迴圈次數:1;
輸入資料後 觸發