8

epollは、ファイルがepolLINのepoll_ctlに登録された後のepoll_waitへの最初の(または進行中の)呼び出しを保証しますか?epoll_ctl呼び出しの前にファイルがすでに読み取り可能であった場合、EPOLLETはすぐに戻りますか?テストプログラムを使った私の実験から、答えはイエスのようです。これが私の質問を明確にするためのいくつかの例です:

epollファイルefdとファイルfd および次のイベント定義を初期化したとします。

event.data.fd = fd;
event.events  = EPOLLIN | EPOLLET;

ここで、このシナリオを検討してください。

  1. thread1:にデータを書き込みますfd
  2. スレッド2:epoll_ctl (efd, EPOLL_CTL_ADD, fd, &event);
  3. スレッド2:epoll_wait (efd, events, MAXEVENTS, -1);

ステップ3の呼び出しはすぐに戻りますか?私の経験ではそうです。これは保証されていますか?

次に、最初のシナリオを拡張して、2番目のシナリオを考えます。

  1. thread1:にデータを書き込みますfd
  2. スレッド2:epoll_ctl (efd, EPOLL_CTL_ADD, fd, &event);
  3. スレッド2:epoll_wait (efd, events, MAXEVENTS, -1);
  4. スレッド2:epoll_ctl (efd, EPOLL_CTL_MOD, fd, &event);
  5. スレッド2:epoll_wait (efd, events, MAXEVENTS, -1);

手順5の呼び出しはすぐに戻りますか?私の経験ではそうです。保証されていますか?

epollのマニュアルページは、この問題について完全に明確ではありません。特に、マニュアルページでは、エッジトリガーモードを使用しているときにEAGAINが返されるまで、常にファイルから読み取る必要があることを示しています。しかし、これらのコメントは、ファイルを待ちたいときはいつでもファイルを再登録しないことを前提としているようです。

epollのエッジトリガーオプションの目的は何ですか?関連する議論です。最初の回答に対する最初の2つのコメントは、私が見ている動作が期待されていることを確認しているようです。

https://gist.github.com/3900742は、パイプを使用したepollが説明したとおりに動作するように見えることを示すCテストプログラムです。

4

1 に答える 1

5

Linux 固有の仕様と同様epollに、実際の仕様はないため、実際に実装されているもの次第です (man ページでは、よりユーザーフレンドリーな方法で説明しようとしていますが、エッジケースの詳細はすべて提供されていません)。

ep_insertep_modifyの両方を見ると、現在のイベント ビットがチェックされます (に関係なくEPOLLET)。

/*
 * Get current event bits. We can safely use the file* here because
 * its usage count has been increased by the caller of this function.
 */
revents = epi->ffd.file->f_op->poll(epi->ffd.file, &pt);

それはあなたが見ている行動を説明しており、それは意図的に行われたようです. ただし、仕様がないため、将来的に動作が変わらないという確実な保証はありません。

于 2012-10-17T14:27:20.353 に答える