読み込みファイル記述子を含むFD_SETでselect()を呼び出すとします。 select()呼び出し中にファイル記述子の1つが閉じた場合はどうなりますか?何らかのエラーが発生したと仮定すると、クローズドファイル記述子を見つけてセットから削除するのは私の責任ですか?Unix:select()の呼び出し中に読み込みファイル記述子が閉じるとどうなるか
答えて
これはどこにでも指定されているとは思いません。一部のシステムはすぐにselect
から戻ってきますが、他のシステムはブロックし続けます。これが起こる唯一の方法は、マルチスレッドプロセスであることに注意してください。は、信号ハンドラから発生したとしても、select
の間は実行できません。したがって、このような状況が発生すると、恐らく大きな問題があることがわかります。ポーリングしているファイルディスクリプタの1つがselect
の間に閉じられる場合、より大きな問題は、同じファイル記述子がclose
の直後に新たにオープンしたファイル(別の無関係のスレッドで開かれたファイル)に再割り当てされ、スレッドそのポーリングは、別のスレッドに属している新しいファイルに対して誤ってIOを実行する可能性があります。
マルチスレッドプログラムでselect
でポーリングされる一連のファイル記述子で構成されるデータオブジェクトがある場合は、そのセットへのアクセスを制御するために何らかの同期プリミティブを使用する必要があります。またはファイル記述子を削除するには、select
(またはメンバー上のIO)が進行中である可能性と相互排他的なロックが必要です。
、それは全くselect
を使用し、代わりに複数のスレッドにIOをブロックする複雑なロックロジックなしで所望の結果を達成させない方がよいです。
select()
システムコールには、Send、Receive、Exceptionの3つのパラメータが必要です。チェックするには、読み込みファイル記述子にエラーが発生した場合は、それをread(受信)とerror(exceprion)のセットに含めます - 返された例外セットでそれを見ると、select()
はそのソケットで例外が発生したことを意味します。あなたは何を見つけるチャンスです。
通常、あらゆる種類の例外を持つネットワークソケットは、送受信に適していません。
送信されたすべてのデータを読み込んだとしても、閉じたソケットは常に読み込み準備ができているとみなされます。 Selectはブロックを解除し、使用可能なソケットを通知します。
- 1. リーダーが閉じられているときに読み込みを呼び出す試みが無効です
- 2. 基礎となるファイル記述子を閉じずにFILEポインタを閉じる
- 3. エンティティのフレームワークデータハンドラが閉じられているときに「読み込み」を呼び出す
- 4. 代替ファイル記述子からシェル変数への読み込み
- 5. ArtifactDescriptorException:アーティファクト記述子Mavenエラーの読み込みに失敗しました
- 6. 親子プロセスのファイル記述子を閉じる
- 7. オフセットでのファイル記述子からの読み書き
- 8. 私はこのエラーが発生し続ける: "リーダーが閉じているときに読み込みを呼び出す試みが無効です"
- 9. Pythonでファイル記述子を閉じるには?
- 10. 別のスレッドから書き込み中に、あるスレッドでファイル記述子から読み込むことはできますか?
- 11. stdout/stderrファイル記述子でos.fsyncを呼び出すと、サブプロセスが終了する
- 12. ファイルから巨大なデータを読み込み、それらを呼び出す
- 13. stdoutとstdinファイル記述子を閉じた後で再オープン
- 14. 閉じたファイル記述子を再オープンする方法
- 15. 親が開いたリスナーソケットファイル記述子を子が閉じないとどうなりますか?
- 16. ajax読み込みコンテンツからJQuery Uiダイアログを閉じる
- 17. PHP読み込み中のコンテンツがページとして読み込まれる
- 18. Cでパイプ、dup2、ファイル記述子を閉じますか?
- 19. jqueryタブの読み込み後にイベントを呼び出す
- 20. テンプレートの読み込み時にコールバックを呼び出す?
- 21. 最終ページの読み込み時にjavascriptを呼び出す
- 22. 終了時にファイル記述子を閉じるのが良い習慣です
- 23. ページの読み込み時に$(ウィンドウ).scroll()が呼び出される
- 24. Eclipse Hell。 。 。プロジェクト記述ファイル(.project)を読み込めません
- 25. 呼び出されたときの読み込み関数のみ - PHP
- 26. bashファイルの読み込み中whileループ
- 27. 複数のファイルを読み込み中
- 28. htmlリクエストでjs.erbファイルを呼び出す(通常のページ読み込み)
- 29. Bluetooth接続が失敗しました:読み込みに失敗しました。ソケットが閉じているかタイムアウトしました。読み込みret:-1
- 30. ファイルをクラスと同じディレクトリに読み込みますか?
select()呼び出し中にfd_setにあるファイル記述子が閉じられる可能性のある唯一の可能な方法は、別のスレッドclose()がそのディスクリプタであることです。 (tcp接続がピアによって閉じられているか、ローカルのtcp/ipスタックが別の問題です)。 – nos
も参照してください。http://stackoverflow.com/questions/3884110/what-is-select-supposed-to-do-if-you-close-a-monitored-fd –