ほとんどの場合select()
、どのフラグが設定されるかは簡単です。
- r データが読み取り可能な場合、
- w 書き込み可能な場合、
- ソケット緊急データの場合は e
しかし、この規則には多くの例外 (または、おそらく重要な拡張機能) があります: 'w' は完了したノンブロッキング接続に対して設定され、'r' はlisten()
保留中の a に対して設定さaccept()
れます。
どのような状況でどのフラグが設定されるかの簡単なリストを見つけた人はいますか?
この参照ページから:
O_NONBLOCK
記述子は、関数がデータを正常に転送するかどうかに関係なく、clear を使用した入力関数への呼び出しがブロックされない場合、読み取りの準備ができていると見なされます。(関数は、データ、ファイルの終わりの表示、またはブロックされていることを示すもの以外のエラーを返す可能性があり、これらの各ケースでは、記述子は読み取りの準備ができていると見なされます。)
O_NONBLOCK
記述子は、関数がデータを正常に転送するかどうかにかかわらず、出力関数への clear の呼び出しがブロックされない場合、書き込みの準備ができていると見なされます。ソケットに保留中のエラーがある場合、保留中の例外条件があると見なされます。それ以外の場合、例外的な条件を構成するものは、ファイルの種類によって異なります。
例外的なセットの記述子を除いて、それはかなり明確です。ブロッキング記述子 (ファイル、ソケット、またはその他の記述子のいずれであっても) がブロックされない場合、それぞれのセットで準備完了としてマークされます。受け入れと受信は「読み取り」操作であり、接続と書き込みは「書き込み」操作です。
唯一の問題は、セットで渡す記述子のタイプに依存する例外的な状態です。
select のリファレンス。select の使用に関する提案を提供します。