ソケットに読み取るデータがあり、select() 関数が呼び出された場合、select() は次のようになります。
- すぐに戻り、ソケットが読み取りの準備ができていることを示します。または
- ソケットでさらにデータを受信するまでブロックする
??
ソケットに読み取るデータがあり、select() 関数が呼び出された場合、select() は次のようになります。
??
簡単にテストできますが、readfds の 1 つで読み取り可能なデータが既に存在する場合、select() は決してブロックしないことを保証します。その場合にブロックした場合、ノンブロッキング I/O を使用したプログラミングにはあまり役に立ちません。select() でループしている例を見てみましょう。読み取るデータがあることがわかり、それを読み取ります。次に、読み取ったデータを処理している間に、さらにデータが入ってきます。select() に戻ると、ブロックされ、さらにデータを待ちます。ただし、接続の反対側のピアは、既に送信されたデータへの応答を待っています。あなたのプログラムは永遠にブロックしてしまいます。タイムアウトなどで回避できますが、ポイントはノンブロッキング I/O を効率的にすることです。
fd が EOF にある場合、select() は複数回呼び出されてもブロックされません。
man 2 select
この質問にかなり直接答えているようです:
select() と pselect() を使用すると、プログラムは複数のファイル記述子を監視し、1 つまたは複数のファイル記述子が何らかのクラスの I/O 操作 (たとえば、入力可能) に対して「準備完了」になるまで待機できます。ブロックせずに対応する I/O 操作 (read(2) など) を実行できる場合、ファイル記述子は準備完了と見なされます。
したがって、少なくともマニュアルによると、利用可能なデータがあればすぐに返されます。