ログファイルの名前を「foo.log.old」に変更し、アプリケーションが「foo.log」に新しいログファイルを書き始めるとします。私はログファイルを追跡して新しい名前を見つけ、「foo.log.old」に行を追加し続けることに驚きました。
私はWindowsでのこの動作に精通していません。実装が可能かどうかわかりません。この動作はLinuxでどのように実装されていますか?これについてもっと学ぶことができる場所はどこですか?
答え1
プログラムはファイルシステム(既存のUNIXファイルシステムではinodeと呼ばれます)によって保持される番号でファイルにリンクされています。
したがって、次の点に注意を払う必要があります。
- ファイル移動を使用しても、
mv
このサブ番号はファイルシステム間で移動しない限り変更されません(元のファイルシステムでthenを使用するのと同じcp
)。rm
- 複数の名前を1つのファイルに関連付けることができるため(つまり、ハードリンクがあるため)、「削除された」ファイルのデータは次回まで消えません。みんな基本ファイルへの参照は消えます。
- おそらく最も重要なことは、プログラムが
open
ファイルにアクセスするときにファイル名をファイルに関連付けるのと同じように(データを削除するために)ファイルを参照することです。
これにより、次のようないくつかの動作が発生します。
- プログラムは
open
ファイルを読み取ることができますが、rm
ユーザーがコマンドラインで編集するまでは実際には読みません。プログラムはまだデータにアクセスできます。。 - あなたが直面しているものは次のとおりです。
mv
ファイルを呼び出しても、ファイルを開くプログラムからファイルが切断されません(ファイルシステムの境界を超えない限り、この場合、プログラムはまだ元のバージョンを使用できます)。 open
プログラムが書き込み用にファイルを編集し、ユーザーがコマンドラインに最後のrm
ファイル名を入力した場合、プログラムはファイルにコンテンツを保存できますが、閉じるとデータは参照されなくなり消えます。- 1つ以上のファイルを介して通信する2つのプログラムは、完了したらファイルを削除しておおよその部分的なセキュリティを得ることができます
open
。 (これではありません実際セキュリティ認識は、脆弱性を競合状態に移行します。 )
答え2
この動作がどのように達成されるかを実際に理解するには、一部のUnixプログラミングブックをご覧ください。 Mathepic は inode に関連しているので正確です。実際のパス名はファイルを開くためにのみ使用され、一度完了すると、プログラムは開かれたファイル記述子を介してそれを参照します。ファイルディスクリプタは順番にinodeを参照します。この場合、デフォルトのファイル名が変更されたかどうかは気にしません。
Windowsでこれを実装することは、他のサイトに関する質問です。
本を読むことなくそれについてもっと読むには、Linuxファイルシステムとinodeを検索します。明確な答えはないかもしれませんが、その理由を理解することができます。