2011-09-04 9 views

答えて

12

これは難しい質問です。しかし、POSIX規格はclose()の説明でそれをカバーない:クローズ()が捕捉されるシグナルによって中断された場合

を、それが返す-1に設定errnoに[EINTR]状態でfildesの不特定のものです。 close()中にファイルシステムの読み書き中にI/Oエラーが発生した場合、errnoを[EIO]に設定して-1を返します。このエラーが返された場合、fildesの状態は未定義です。

したがって、ファイルディスクリプタの状態は標準では指定されていません。

ほとんどの実用的な目的のために、閉じています。あなたが公式に開いていても、ファイル記述子でできることはほとんどありません。 (fcntl()F_GETFLのような)無害な操作を試して、EBADFが戻ってきて、ディスクリプタが正式に閉じられたかどうかを確認することができます。しかし、それが開いていて、EIOエラーの原因が永久的であれば、何かをしようとするたびにEIOを取得する可能性があります(fcntl()コールを含む可能性があります)。あなたは、別のオープンな操作によって返された同じ記述子を得るかもしれないし、そうでないかもしれない。デッドファイルディスクリプタがオープンであるがクローズ不可能な場合は、dup2()でもターゲットとして 'dead'ファイルディスクリプタを指定できたことは明らかではありません。

+8

あなたのプログラムがマルチスレッドであるかシグナルハンドラを使っている場合、 'fcntl()'を使ってファイル記述子をテストするのは簡単ではないかもしれません。なぜならそれは閉じられていて、 – mark4o

+0

libuvのような非stdioフレームワークを使用すると、これは問題になりますか? – Breton

+0

これは 'open()'、 'close()'と親戚を使って構築されたフレームワークでは問題になりますので、 'libuv'が' open() 'や' close() ' (これはかなり可能性がありません)、 'close()'がうまくいかず、ファイルディスクリプタが不確定な状態になってしまうという問題が発生する可能性があります。 –

関連する問題