7

次のように、Webでエッジトリガーepoll関数に関するドキュメントを読みました。

1. The file descriptor that represents the read side of a pipe (rfd) is registered on the epoll instance.
2. A pipe writer writes 2 kB of data on the write side of the pipe.
3. A call to epoll_wait(2) is done that will return rfd as a ready file descriptor.
4. The pipe reader reads 1 kB of data from rfd.
5. A call to epoll_wait(2) is done.
.......
.......

epollをエッジトリガー(EPOLLET)インターフェイスとして使用するための推奨される方法は、次のとおりです。i)非ブロッキングファイル記述子を使用します。ii)read(2)またはwrite(2)がEAGAINを返した後でのみ、イベントに対してepoll_waitを呼び出します。

2は理解しましたが、非ブロッキングファイル記述子が使用される理由がわかりませんでした。

非ブロッキングファイル記述子が使用される理由を誰かが説明できますか?レベルでトリガーされるepoll関数でブロッキングファイル記述子を使用しても問題ないのはなぜですか?

4

3 に答える 3

9

アイデアは、必要なデータがあるというエッジトリガー通知があるときに、ファイル記述子を完全に排出しようとすることです。そのため、一度戻ると、必要なデータがなくなるまで戻るまでorepoll()をループします。read()write()-EAGAIN

fd がブロックされて開かれた場合、この最後のread()orwrite()もブロックされ、epoll()呼び出しに戻って fd のセット全体を待機する機会がありません。ノンブロッキングで開くと、最後のread()/write()が返され、ポーリングに戻る可能性があります。

epoll()これは、レベル トリガー方式で使用する場合はそれほど問題ではありません。この場合、必要なデータepoll()がある場合はすぐに返されるためです。したがって、次のような(疑似コード)ループ:

while (1) {
  epoll();
  do_read_write();
}

do_read_write()データがある限り呼び出すことが保証されているため、機能します。エッジ トリガー epoll を使用する場合、新しいデータが利用可能であるという通知が の終了do_read_write()と次の の呼び出しの間に来ると、見逃される可能性がありますepoll()

于 2013-02-01T09:41:54.110 に答える
0

エッジトリガーのセマンティクスのためだと思います。セマンティクスによると、エッジ トリガーは、EAGAIN が受信された場合にのみ、別のイベントを発生させます。ソケットをブロックしている場合、EAGAIN はありません。他の方法で定義することもできましたが、これが Linux の定義方法です。つまり、ブロッキング ソケットを使用すると、いつ epoll_wait を安全に呼び出すことができるかわかりません。

于 2013-09-13T20:12:11.653 に答える