POSIXインタフェースを使ってソケットプログラミングをしています。非ブロックソケットが読み取り/書き込みの準備ができているかどうかを監視するためにselect()関数を使用しようとしています。
select() 関数を使用する場合、読み取りおよび書き込みファイル記述子のセットを提供します。特にソケットfdがあり、読み書きが可能であることを確認したいと思います。
これPOSIX ドキュメント戻り値は、すべてのfdセット内のすべてのファイル記述子の合計として宣言されます。
私の初期のテストでは、「2」が得られたことがわかりました。これは良い結果です(私のソケットが読み書き可能であることを意味します)。しかし、ファイル記述子が同時に読み書き可能にならない場合はどうなりますか?書き込み可能になる前にマイクロ秒間読み取れるようになったとしますか?どうしたの?ただ1を返しますか?
答え1
select()
1 つ以上のファイル記述子が読み取りまたは書き込みの準備ができたとき、タイムアウトに達したとき、信号によって中断されたときに返されます。
これは、少なくとも1つのファイル記述子が読み取りまたは書き込みの準備ができていることを確認してから、select()
指定された一連のファイル記述子(これらのセットは変更済み)をテストする必要があることを意味します。select()
正常に完了した場合、または機能が完了した
pselect()
場合select()
readfds
writefds
引数が指すオブジェクトは、errorfds
各ファイルディスクリプタが読み取る準備ができているか、書き込む準備ができているか、または保留中のエラー条件があるかどうかを示すために変更する必要があり、すべての出力セットで準備されたディスクリプタの総数を返す必要があります。小さいファイル記述子ごとに、対応するビットが入力時に設定され、nfds
そのファイル記述子の関連条件がtrueの場合、正常終了時に設定されます。
読み書きするためにファイル記述子を開く必要がある場合は、両方のselect()
条件が満たされるまで繰り返す必要があります。