epollは、ファイルがepolLINのepoll_ctlに登録された後のepoll_waitへの最初の(または進行中の)呼び出しを保証しますか?epoll_ctl呼び出しの前にファイルがすでに読み取り可能であった場合、EPOLLETはすぐに戻りますか?テストプログラムを使った私の実験から、答えはイエスのようです。これが私の質問を明確にするためのいくつかの例です:
epollファイルefd
とファイルfd
および次のイベント定義を初期化したとします。
event.data.fd = fd;
event.events = EPOLLIN | EPOLLET;
ここで、このシナリオを検討してください。
- thread1:にデータを書き込みます
fd
- スレッド2:
epoll_ctl (efd, EPOLL_CTL_ADD, fd, &event);
- スレッド2:
epoll_wait (efd, events, MAXEVENTS, -1);
ステップ3の呼び出しはすぐに戻りますか?私の経験ではそうです。これは保証されていますか?
次に、最初のシナリオを拡張して、2番目のシナリオを考えます。
- thread1:にデータを書き込みます
fd
- スレッド2:
epoll_ctl (efd, EPOLL_CTL_ADD, fd, &event);
- スレッド2:
epoll_wait (efd, events, MAXEVENTS, -1);
- スレッド2:
epoll_ctl (efd, EPOLL_CTL_MOD, fd, &event);
- スレッド2:
epoll_wait (efd, events, MAXEVENTS, -1);
手順5の呼び出しはすぐに戻りますか?私の経験ではそうです。保証されていますか?
epollのマニュアルページは、この問題について完全に明確ではありません。特に、マニュアルページでは、エッジトリガーモードを使用しているときにEAGAINが返されるまで、常にファイルから読み取る必要があることを示しています。しかし、これらのコメントは、ファイルを待ちたいときはいつでもファイルを再登録しないことを前提としているようです。
epollのエッジトリガーオプションの目的は何ですか?関連する議論です。最初の回答に対する最初の2つのコメントは、私が見ている動作が期待されていることを確認しているようです。
https://gist.github.com/3900742は、パイプを使用したepollが説明したとおりに動作するように見えることを示すCテストプログラムです。