2012-01-01 8 views
4

リスニングソケットでepoll_wait()を実行していて、epoll_wait()がアクティビティを持っていることを返すと(この場合はaccept()を待っている) )、errno = EINTRでaccept()呼び出しが失敗した場合、epoll_wait()は次回の返答時に同じ接続が待ち受けソケットで待機していることを示しますか? ()接続が受け入れられますことを確認するために、シグナルで中断されたepoll_wait()

while(1){ 
    epoll_wait(epfd, &events, maxevents, timeout); 
    if (events.data.fd == listener){ 
     connsock = accept(listener, &addr, &addrlen); 
     while (connsock != -1){ 
      if (errno == EINTR){ 
       accept(listener, &addr, &addrlen); 
       } 
      } 
     } 
    } 

、または意志この作品を、まだのための接続が受け入れていることを確認します。

つまり、私はの線に沿って何かをする必要があります。受け入れられますシグナルによって割り込まれた:

この場合
while(1){ 
    epoll_wait(epfd, &events, maxevents, timeout); 
    if (events.data.fd == listener){ 
     connsock = accept(listener, &addr, &addrlen); 
     } 
    } 

()を受け入れる場合、イベントがepoll_waitが再び戻った後、それだけでループを同じ接続次回を拾うよ信号によって中断されています。

明らかに、これらの両方の例では、(たとえば、epoll_waitの呼び出しで1つのソケットで1つのイベントしか返されません)、エラーチェックは行われません(accept()ここでは全体的なことです)。簡略化のため

答えて

2

これはエッジトリガとレベルトリガの違いです。デフォルトのレベルトリガーを使用すると、それを心配する必要はありません。

レベルトリガーとのトレードオフは、別のスレッドがepoll_waitにコールバックしている間に検出されたイベントを1つのスレッドで処理できないことです。同じイベントを再度検出するだけです。しかし、ほとんどの場合、とにかくこれを行う必要はなく、イベントを失うことは不可能であるというトレードオフは価値があります。

+0

とにかくイベントを失うことはありません。保留中の接続が正常に受け入れられるかタイムアウトになるまで、それはカーネルのバックログに残され、次回のポーリング時にepoll_waitをただちに起動します。 –

+2

@JasonCocoエッジトリガーモードではありません。エッジトリガーモードの全体のポイントは、別のスレッドが 'epoll_wait'を呼び出している間にあるスレッドがイベントを処理できるように、* new *イベントがない場合はブロックを発生させないようにすることです。 (Level-triggeredがデフォルトです)新しいイベントリアンアームは 'EPOLLONESHOT'でも選択できます。 –

+0

お返事ありがとうございます。したがって、レベルトリガーとエッジトリガーの違いは、「特定の状態にある」と「最後に見たときから特定の状態に変化した」との違いと考えることができます。それは私がマニュアルページを読んでいると理解していたのですが、私の理解が正しいことを確認したことはありませんでした。 –

関連する問題