1. 程式人生 > 其它 >Linux中epoll的LT、ET模式

Linux中epoll的LT、ET模式

技術標籤: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;

輸入資料後 觸發