epoll兩種模式(lt et)複習

2021-08-14 10:41:23 字數 2635 閱讀 9417

最近又在複習一些基礎知識,現在看看epoll的相關知識點。

兩種模式(簡單理解):

lt(水平觸發):對於採用lt工作模式的檔案描述符,當epoll_wait檢測到其上有事件發生並將此事件通知應用程式後,應用程式可以不立即處理該事件,當應用程式下一次呼叫epoll_wait時,epoll_waite還會再次向應用程式通告此事件,直到該時間被處理。

et(邊緣觸發):對於採用et工作模式的檔案描述符,當epoll_wait檢測到其上有事件發生並將此事件通知應用程式後,應用程式必須立即處理該事件,因後續的epoll_wait呼叫將不再向應用程式通知這件事。

0x03 示例和測試

#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 )

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* argv )

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 );

while( 1 )

lt( events, ret, epollfd, listenfd );

//et( events, ret, epollfd, listenfd );

}close( listenfd );

return 0;

}

編譯兩個程式:

gcc -o lt main.cpp

gcc -o et main.cpp

執行:lt模式:

兩次事件觸發。buffer中的資料做兩次觸發讀出。

et模式:

僅觸發了一次事件,將buffer中的資料全部讀出。

lt模式和et模式,兩種模式的差異,是核心事件的處理方式的不同。

epoll的兩種模式 LT ET

關於epoll的兩種工作模式 lt level trigger,電平觸發 模式 et edge trigger,邊沿觸發 模式。et模式在很大程度上降低了同乙個 epoll 事件被重複觸發的次數。用以下 測試 lt et在工作方式上的差異。include include include includ...

epoll的兩種工作模式LT ET

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

EPOLL兩種模式

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