2016-12-18 8 views
1

これはおそらく一部の人にとっては些細な質問ですが、どういうわけかそれについてはわかりません。poll/epollの処理は割り込みコンテキストにありますか?

カーネルからイベントのポーリングを待つとき、新しいイベントの処理が割り込みコンテキストで行われるのでしょうか?

もしそうでなければ、ハンドラ内でハンドラ内の他のコマンドを使用してスリープ/ウェイトできますか?

int main (void) 
{ 
    struct pollfd fds[2]; 
    int ret; 


    fds[0].fd = FILENO; 
    fds[0].events = POLLIN; 


    fds[1].fd = FILENO; 
    fds[1].events = POLLOUT; 

    ret = poll(fds, 2, TIMEOUT * 1000); 

    if (ret == -1) { 
     perror ("poll"); 
     return 1; 
    } 

    if (!ret) { 
     return 0; 
    } 

    if (fds[0].revents & POLLIN) 
    { 
     /********** HANDLING EVENTS HERE ***************/ 
     printf ("FILENO is POLLIN\n"); 
    } 

    if (fds[1].revents & POLLOUT) 
    { 
     /********** HANDLING EVENTS HERE ***************/ 
     printf ("FILENO is POLLOUT\n"); 
    } 

    return 0; 

} 

はありがとう、 はありません(一般的に)

+0

「割り込みコンテキスト」は、カーネルレベルの懸案事項です。ユーザー空間プログラムには影響しません。 – davmac

答えて

1

蘭。

poll()を呼び出すと、プロセッサコンテキストはカーネルコンテキストに切り替わり、他のプロセス(およびカーネルスレッド)が実行されます。あなたのプロセスは、少なくとも1つのFDが準備完了した後、ある時点でコンテキストスイッチバックされます。一般的には(パイプなど)、割り込みコンテキストは必要ありませんが、I/Oによっては割り込みコンテキストが発生する必要があります(直接接続されていないことに注意してください)(poll()に直接接続されていない)。

+0

これは、ユーザー空間へのタイマーイベントをトリガーするカーネルドライバーで、hrtimerをラップし、ユーザー空間からのポーリングをサポートするモジュールです。 – ransh

+0

@ransh:あなたの質問(タイマーは言及していませんでした)は、「新しいイベントの処理は割り込みコンテキストで行われますか?それに対する答えはまだノーです。イベントを発生させるタイマ割り込みがあるかもしれませんが、イベントとコンテキストの実際の処理はカーネルコンテキストで行われます。 – abligh

関連する問題