ファイルが (同じファイル システム内で) 移動されるか、名前が変更された場合、ファイル ハンドルは開いたままになり、引き続きファイルの読み取りと書き込みに使用できます。
ファイルが削除された場合、ファイル ハンドルは開いたままになり、引き続き使用できます (これは、一部の人が期待することではありません)。最後のハンドルが閉じられるまで、ファイルは実際には削除されません。
ファイルが新しいファイルに置き換えられた場合、それは正確にその方法によって異なります。ファイルの内容が上書きされた場合でも、ファイル ハンドルは有効であり、新しい内容にアクセスできます。既存のファイルのリンクが解除され、同じ名前で新しいファイルが作成された場合、または rename()
を使用して新しいファイルが既存のファイルに移動された場合 、削除と同じです (上記参照) - つまり、ファイル ハンドルは引き続きオリジナルを参照します。 ファイルのバージョン。
一般に、一度ファイルが開かれると、そのファイルは開かれ、ディレクトリ構造を変更しても、それを変更することはできません。移動したり、ファイルの名前を変更したり、その場所に何か他のものを配置したりできますが、単に開いたままにするだけです。
Unix では削除はなく、unlink()
のみです。 、必ずしもファイルを削除するわけではなく、ディレクトリからリンクを削除するだけなので、これは理にかなっています.
一方、基盤となるデバイスが消失した場合 (USB プラグの抜き差しなど)、ファイル ハンドルは有効ではなくなり、操作で IO/エラーが発生する可能性があります。それでも閉じる必要があります。この場合、ファイルを開いたままにしておくのは賢明ではないため、デバイスが再び接続されている場合でも、これは当てはまります。
ファイル ハンドルはパスではなく inode を指しているため、ハンドルがファイルを指しているため、ほとんどのシナリオは想定どおりに機能します。
具体的には、削除シナリオでは、この関数は理由から「リンク解除」と呼ばれ、ファイル名 (dentry) とファイルの間の「リンク」を破棄します。ファイルを開いてリンクを解除すると、参照カウントがゼロになるまで、つまりハンドルを閉じるまで、ファイルは実際には存在し続けます。
編集: ハードウェアの場合、特定のデバイス ノードへのハンドルを開いています。デバイスを取り外すと、デバイスが戻ってきても、カーネルはそのデバイスへのすべてのアクセスに失敗します。デバイスを閉じて、再度開く必要があります。
他の操作についてはわかりませんが、削除に関しては、ファイルへの最後の開いているハンドルが閉じられるまで、削除は(物理的に、つまりファイルシステムで)行われません。したがって、アプリケーションからファイルを削除することはできません。
いくつかのアプリ (思い浮かびません) は、ファイルを作成、開き、すぐに削除することで、この動作に依存しています。ファイルは、アプリケーションとまったく同じくらい存続します。他のアプリケーションは、必要なく最初のアプリのライフサイクルを認識することができます。プロセス マップなどを参照してください。
同様の考慮事項が他のものにも当てはまる可能性があります。