ファイルを削除すると、そのファイルへの(iノードへの)リンクが本当に削除されます。誰かがすでにそのファイルを開いている場合、そのファイル記述子を保持し続けます。ファイルはディスク上に残り、スペースを占有します。ファイルへのアクセス権があれば、ファイルの読み書きが可能です。
unlink
関数は POSIXによって、この動作で定義されています。
ファイルのリンク数が0になり、どのプロセスもファイルを開いていない場合、ファイルによって占有されていたスペースが解放され、ファイルにアクセスできなくなります。最後のリンクが削除されたときに1つ以上のプロセスがファイルを開いている場合、unlink()が戻る前にリンクが削除されますが、ファイルへのすべての参照が閉じられるまで、ファイルの内容の削除は延期されます。
その行動のためのこのアドバイスの断片。デーモンはファイルを開いたままにし、削除されたことに気付かないでしょう(それが特別に監視している場合を除き、これは一般的ではありません)。それはそれが持っている既存のファイル記述子への書き込みを続けます:ディスク上の(より多くの)スペースを占有し続けますが、書き込むメッセージのどれも見ることができないので、あなたは本当に最悪です両方の世界の。代わりにファイルの長さをゼロに切り詰めると、スペースはすぐに解放され、新しいメッセージはファイルの新しい末尾に表示され、そこに表示されます。
最終的に、デーモンが終了するかclose
ファイルをsすると、スペースが解放されます。その間、誰もファイルを開くことができません(Linuxの/proc/x/fd/...
ようなシステム固有のリフレクトインターフェイスを使用する場合を除きます)。また、次のことが保証されています。
ファイルのリンクカウントが0の場合、そのファイルに関連付けられたすべてのファイル記述子が閉じられると、ファイルによって占有されていたスペースが解放され、ファイルにアクセスできなくなります。
したがって、ディスクスペースを永久に失うことはありませんが、ファイルを削除しても何も得られず、新しいメッセージにアクセスできなくなります。
/proc/x/fd/y
どうなりますか?プロセスがファイル記述子への書き込みに失敗するのでしょうか、それとも不正な操作ですか?