1. ホーム
  2. linux

[解決済み] Linuxで開いているファイルハンドルは、指されたファイルが移動または削除されるとどうなるのか?

2022-08-16 17:29:53

質問

Linux で開いているファイルハンドルは、指定されたファイルを取得するとどうなりますか。

  • 移動された -> ファイル ハンドルは有効なままですか?
  • 削除された -> これは無効なファイル ハンドルを示す EBADF につながりますか?
  • 新しいファイルに置き換えられた -> この新しいファイルを指すファイル ハンドルはありますか?
  • 新しいファイルへのハード リンクによって置き換えられました -> ファイル ハンドルはこのリンクを "follow"していますか?
  • 新しいファイルへのソフトリンクに置き換え -> 私のファイル ハンドルは今このソフトリンク ファイルに当たっていますか?

なぜこのような質問をしているかというと 私は、ホットプラグされたハードウェア (USB デバイスなど) を使用しています。デバイス (およびその /dev/ ファイル) がユーザーまたは別の Gremlin によって再接続されることが起こり得ます。

これに対処するベスト プラクティスは何でしょうか。

どのように解決するのですか?

ファイルを移動したり (同じファイルシステム内で)、名前を変更したりしても、ファイル ハンドルは開いたままで、ファイルの読み取りや書き込みに使用することができます。

ファイルが削除された場合、ファイル ハンドルは開かれたままで、まだ使用できます (これは一部の人が期待することではありません)。最後のハンドルが閉じられるまで、ファイルは実際には削除されません。

ファイルが新しいファイルによって置き換えられる場合、それは正確にどのように行われるかに依存します。ファイルのコンテンツが上書きされた場合、ファイル ハンドルはまだ有効で、新しいコンテンツにアクセスできます。既存のファイルのリンクが解除され、同じ名前で新しいファイルが作成された場合、または、新しいファイルを既存のファイルに rename() を使用して新しいファイルを既存のファイルに移動した場合は、 削除 (上記参照) と同じになります。 元の のバージョンを参照し続けるということです。

一般に、一度ファイルが開かれると、そのファイルは開かれたままであり、ディレクトリ構造を変更する誰もそれを変更することはできません。ファイルを移動したり、名前を変更したり、その場所に別のものを置いたりしても、それは単に開かれたままなのです。

Unix では、削除はありません。 unlink() であり、これは必ずしもファイルを削除するわけではなく、ディレクトリからリンクを削除するだけなので、理にかなっています。


一方、基礎となるデバイスが消滅した場合 (例: USB の取り外し)、ファイル ハンドルはそれ以上有効ではなく、あらゆる操作で IO/error が発生する可能性があります。しかし、ファイルハンドルは閉じなければなりません。この場合、ファイルを開いたままにしておくことは賢明ではないので、デバイスが再び接続された場合でも同じことが言えます。