で使用する前に、ファイル記述子をノンブロッキングにする必要がありselect()
ますか?
3 に答える
関係ない。
select
どのソケットが読み取り可能/書き込み可能/クローズ/関心のある状態にあるかを示します。ブロック/非ブロックは、たとえばarecv
またはsend
callの動作に影響します。これらは互いに独立しています。
Select自体は、監視に使用される記述子のブロック状況に関係なくブロックされます。選択をブロックしたくない場合は、タイムアウト0を使用します(つまり、nilポインターではなく、ゼロのtimeval構造を指します)。
の目的select
はブロックすることなので、非ブロック フラグは無視されます。ただし、Linux マニュアル ページのバグ セクションで説明されているように:
Linux では、select() がソケット ファイル記述子を「読み取り準備完了」と報告する場合がありますが、その後の読み取りはブロックされます。これは、たとえば、データが到着したが、検査時に間違ったチェックサムがあり、破棄された場合に発生する可能性があります。ファイル記述子が誤って準備完了と報告される状況が他にもある可能性があります。したがって、ブロックしてはならないソケットでは O_NONBLOCK を使用する方が安全かもしれません。
そのため、バグのある動作のため、ファイル記述子をノンブロッキングに設定する必要があります。