9

読み取りファイル記述子の束を含むFD_SETでselect()を呼び出すとしましょう。select()呼び出し中に、ファイル記述子の1つが閉じた場合はどうなりますか?ある種のエラーが発生したとすると、閉じたファイル記述子を見つけてセットから削除するのは私の責任ですか?

4

3 に答える 3

4

これがどこにも指定されているとは思いません。一部のシステムはすぐに復帰しselect、他のシステムはブロックを継続する場合があります。これが発生する可能性がある唯一の方法は、マルチスレッドプロセスであることに注意してください(そうでない場合、 ;close中に発生することはできませんselect。シグナルハンドラーから発生した場合でも、シグナルselectによってすでに中断されています)。このように、この状況が発生することは、おそらくあなたが心配すべきより大きな問題を抱えていることを示しています。ポーリング中のファイル記述子の1つを閉じることができる場合select、より大きな問題は、同じファイル記述子が、の直後に新しく開かれたファイル(たとえば、別の無関係なスレッドで開かれたファイル)closeとポーリングしているスレッドに再割り当てされる可能性があることです。次に、別のスレッドに「属する」新しいファイルに対して誤ってIOを実行する可能性があります。

マルチスレッドプログラムでポーリングされるファイル記述子のセットで構成されるデータオブジェクトがある場合は、selectほぼ確実に、そのセットへのアクセスを制御するために何らかの同期プリミティブを使用する必要があり、ファイル記述子を追加または削除する必要があります。select(またはメンバーのIO)が進行中である可能性がある相互に排他的なロックが必要です。

もちろん、マルチスレッドプログラムでは、selectまったく使用せず、代わりに、複雑なロックロジックを使用せずに、複数のスレッドでIOをブロックすることで目的の結果を達成できるようにする方がよい場合があります。

于 2012-04-06T16:27:42.103 に答える
1

select()システムコールは、送信、受信、例外の3つのパラメータを取りますfd_set。確認するには、読み取りファイル記述子でエラーが発生した場合、それを読み取り(受信)およびエラー(例外)セットに含めます-手段からの戻り時に例外セットにそれを表示select()すると、そのソケットで例外が発生し、次のようになります。何を見つけるチャンス。

一般に、何らかの例外のあるネットワークソケットは、送受信に適していません。

于 2012-04-06T16:24:27.173 に答える
1

送信されたすべてのデータを読み取った場合でも、閉じたソケットは常に読み取る準備ができていると見なされます。Selectはブロックを解除し、そのソケットが使用可能であることを通知します。

于 2012-04-06T16:26:02.007 に答える