1

ソケットに読み取るデータがあり、select() 関数が呼び出された場合、select() は次のようになります。

  1. すぐに戻り、ソケットが読み取りの準備ができていることを示します。または
  2. ソケットでさらにデータを受信するまでブロックする

??

4

2 に答える 2

2

簡単にテストできますが、readfds の 1 つで読み取り可能なデータが既に存在する場合、select() は決してブロックしないことを保証します。その場合にブロックした場合、ノンブロッキング I/O を使用したプログラミングにはあまり役に立ちません。select() でループしている例を見てみましょう。読み取るデータがあることがわかり、それを読み取ります。次に、読み取ったデータを処理している間に、さらにデータが入ってきます。select() に戻ると、ブロックされ、さ​​らにデータを待ちます。ただし、接続の反対側のピアは、既に送信されたデータへの応答を待っています。あなたのプログラムは永遠にブロックしてしまいます。タイムアウトなどで回避できますが、ポイントはノンブロッキング I/O を効率的にすることです。

fd が EOF にある場合、select() は複数回呼び出されてもブロックされません。

于 2012-06-11T23:25:41.873 に答える
1

man 2 selectこの質問にかなり直接答えているようです:

select() と pselect() を使用すると、プログラムは複数のファイル記述子を監視し、1 つまたは複数のファイル記述子が何らかのクラスの I/O 操作 (たとえば、入力可能) に対して「準備完了」になるまで待機できます。ブロックせずに対応する I/O 操作 (read(2) など) を実行できる場合、ファイル記述子は準備完了と見なされます。

したがって、少なくともマニュアルによると、利用可能なデータがあればすぐに返されます。

于 2012-06-11T21:31:23.193 に答える