3

で使用する前に、ファイル記述子をノンブロッキングにする必要がありselect()ますか?

4

3 に答える 3

6

関係ない。

selectどのソケットが読み取り可能/書き込み可能/クローズ/関心のある状態にあるかを示します。ブロック/非ブロックは、たとえばarecvまたはsendcallの動作に影響します。これらは互いに独立しています。

于 2011-04-05T16:00:17.640 に答える
3

Select自体は、監視に使用される記述子のブロック状況に関係なくブロックされます。選択をブロックしたくない場合は、タイムアウト0を使用します(つまり、nilポインターではなく、ゼロのtimeval構造を指します)。

于 2011-04-05T16:08:53.163 に答える
0

の目的selectはブロックすることなので、非ブロック フラグは無視されます。ただし、Linux マニュアル ページのバグ セクションで説明されているように:

Linux では、select() がソケット ファイル記述子を「読み取り準備完了」と報告する場合がありますが、その後の読み取りはブロックされます。これは、たとえば、データが到着したが、検査時に間違ったチェックサムがあり、破棄された場合に発生する可能性があります。ファイル記述子が誤って準備完了と報告される状況が他にもある可能性があります。したがって、ブロックしてはならないソケットでは O_NONBLOCK を使用する方が安全かもしれません。

そのため、バグのある動作のため、ファイル記述子をノンブロッキングに設定する必要があります。

于 2013-11-03T11:25:38.593 に答える