2012-04-06 9 views
9

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

+0

select()呼び出し中にfd_setにあるファイル記述子が閉じられる可能性のある唯一の可能な方法は、別のスレッドclose()がそのディスクリプタであることです。 (tcp接続がピアによって閉じられているか、ローカルのtcp/ipスタックが別の問題です)。 – nos

+0

も参照してください。http://stackoverflow.com/questions/3884110/what-is-select-supposed-to-do-if-you-close-a-monitored-fd –

答えて

4

これはどこにでも指定されているとは思いません。一部のシステムはすぐにselectから戻ってきますが、他のシステムはブロックし続けます。これが起こる唯一の方法は、マルチスレッドプロセスであることに注意してください。は、信号ハンドラから発生したとしても、selectの間は実行できません。したがって、このような状況が発生すると、恐らく大きな問題があることがわかります。ポーリングしているファイルディスクリプタの1つがselectの間に閉じられる場合、より大きな問題は、同じファイル記述子がcloseの直後に新たにオープンしたファイル(別の無関係のスレッドで開かれたファイル)に再割り当てされ、スレッドそのポーリングは、別のスレッドに属している新しいファイルに対して誤ってIOを実行する可能性があります。

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

マルチスレッドプログラムにおけるもちろん

、それは全くselectを使用し、代わりに複数のスレッドにIOをブロックする複雑なロックロジックなしで所望の結果を達成させない方がよいです。

1

select()システムコールには、Send、Receive、Exceptionの3つのパラメータが必要です。チェックするには、読み込みファイル記述子にエラーが発生した場合は、それをread(受信)とerror(exceprion)のセットに含めます - 返された例外セットでそれを見ると、select()はそのソケットで例外が発生したことを意味します。あなたは何を見つけるチャンスです。

通常、あらゆる種類の例外を持つネットワークソケットは、送受信に適していません。

+0

実際には、緊急データには「exceptfds」が使用されます。 – cnicutar

+0

http://linux.die.net/man/2/selectだけでなく、私の経験はそうでないと言っています:*「exceptfdsのファイル記述子は例外を監視する」* –

+0

私は自分の答えを宣伝したくない私はリンクと引用を追加しました。 – cnicutar

1

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

関連する問題