close(2)システムコールがEIOで失敗した場合でも、ファイルディスクリプタは削除されますか?close(2)がEIOで失敗する場合、ファイル記述子は削除されますか?
「はい」の場合は、後で再試行して誤ったIOエラーを処理することはできませんか?もしそうでなければ、ファイルディスクリプタのリークをどのように防ぐべきでしょうか?
close(2)システムコールがEIOで失敗した場合でも、ファイルディスクリプタは削除されますか?close(2)がEIOで失敗する場合、ファイル記述子は削除されますか?
「はい」の場合は、後で再試行して誤ったIOエラーを処理することはできませんか?もしそうでなければ、ファイルディスクリプタのリークをどのように防ぐべきでしょうか?
これは難しい質問です。しかし、POSIX規格はclose()
の説明でそれをカバーない:クローズ()が捕捉されるシグナルによって中断された場合
を、それが返す-1に設定errnoに[EINTR]状態でfildesの不特定のものです。 close()中にファイルシステムの読み書き中にI/Oエラーが発生した場合、errnoを[EIO]に設定して-1を返します。このエラーが返された場合、fildesの状態は未定義です。
したがって、ファイルディスクリプタの状態は標準では指定されていません。
ほとんどの実用的な目的のために、閉じています。あなたが公式に開いていても、ファイル記述子でできることはほとんどありません。 (fcntl()
とF_GETFL
のような)無害な操作を試して、EBADFが戻ってきて、ディスクリプタが正式に閉じられたかどうかを確認することができます。しかし、それが開いていて、EIOエラーの原因が永久的であれば、何かをしようとするたびにEIOを取得する可能性があります(fcntl()
コールを含む可能性があります)。あなたは、別のオープンな操作によって返された同じ記述子を得るかもしれないし、そうでないかもしれない。デッドファイルディスクリプタがオープンであるがクローズ不可能な場合は、dup2()
でもターゲットとして 'dead'ファイルディスクリプタを指定できたことは明らかではありません。
あなたのプログラムがマルチスレッドであるかシグナルハンドラを使っている場合、 'fcntl()'を使ってファイル記述子をテストするのは簡単ではないかもしれません。なぜならそれは閉じられていて、 – mark4o
libuvのような非stdioフレームワークを使用すると、これは問題になりますか? – Breton
これは 'open()'、 'close()'と親戚を使って構築されたフレームワークでは問題になりますので、 'libuv'が' open() 'や' close() ' (これはかなり可能性がありません)、 'close()'がうまくいかず、ファイルディスクリプタが不確定な状態になってしまうという問題が発生する可能性があります。 –