3

ネストされた FD の動作に関するオンラインの情報は非常に限られています。

EPOLL FD1 が EPOLL FD2 と FD3 の間で共有されているとします。では、epoll FD1 がイベントを取得するとどうなるでしょうか

  1. epoll_exclusive フラグなしで追加すると、FD2 と Fd3 の両方にイベントが発生しますか。
  2. イベントを取得した後、FD1 で epoll_wait を実行してイベントをクリアする必要がありますか?

そして、ネストされた epoll FD の使用例は何ですか。

4

1 に答える 1

2

レベル トリガーの場合は、非常に簡単です。

  1. はい、epoll(7) マンページの Q&A 部分から Q2 と Q3 への回答を組み合わせることができます:
    A2: 同じファイル記述子が 2 つの epoll インスタンスに追加された場合、イベントはそれらの両方に報告されます。
    A3: epoll ファイル ディスクリプタに待機中のイベントがある場合、読み取り可能として示されます。
  2. いいえ、イベントのクリアはエッジ トリガーの epoll にのみ関連するためです。

エッジ トリガーの場合、ネストに関係なく、同じ FD がEPOLLET2 つの epoll インスタンスに追加された場合、両方がすべてのイベントを 1 回報告するため、1 に対する答えは同じままであると予想されます。

2 番目の質問に対する答えがどうあるべきかはわかりませんが、問題ではありません。エッジ トリガー モードで epoll FD を追加するとバグが発生します。それらは常にレベル トリガーのように動作し、FD2 と FD3 は保留中のイベントがある限り FD1 が読み取り可能であることを示し続けます。まだ本土に作成されていないと思われる修正の試みについてのこのスレッドを見ることができます: fs/epoll: ネストされた epoll のエッジ トリガー モードを修正します。さまざまなシナリオをテストする
このGitHub リポジトリにリンクしています。面白いと思うかもしれません。

于 2019-11-24T14:26:54.897 に答える