Linuxシステムで開いているファイルはどのように動作しますか?


17

ログファイルの名前を「foo.log.old」に変更し、アプリケーションが「foo.log」で新しいログファイルの書き込みを開始すると想定しました。ログファイルを新しい名前で追跡し、「foo.log.old」に行を追加し続けていることに驚いた。

Windowsでは、私はこの種の動作に精通していません-それを実装することさえ可能かどうかわかりません。この動作はLinuxでどのくらい正確に実装されていますか?どこで詳細を知ることができますか?


私は本当に知らないので、これを答えとしてはいませんが、ファイルを移動してもiノードが変更されないことと関係があると思います。
数学

回答:


20

プログラムは、ファイルシステムが保持する番号(従来のUNIXファイルシステムではiノードと呼ばれます)を介してファイルに接続します。名前は単なる参照であり(おそらく一意の参照ではありません)。

そのため、次の点に注意してください。

  1. を使用mvしてファイルを移動しても、ファイルシステム間で移動しない限り、その基数は変わりません(元のファイルでcpthen を使用するのと同じrmです)。
  2. 1つのファイルに複数の名前を接続できるため(つまり、ハードリンクがあるため)、「削除済み」ファイルのデータは、基になるファイルへのすべての参照がなくなるまで消えません。
  3. おそらく最も重要なのは、プログラムがopenファイルを参照するとき、ファイルへの参照を作成することです(データをいつ削除するかという目的のため)。

これにより、次のようないくつかの動作が発生します。

  • プログラムはopen読み取り用のファイルを作成できますが、ユーザーrmがコマンドラインでファイルを編集するまで実際に読み取ることはできません。プログラムは引き続きデータにアクセスできます
  • あなたが遭遇したもの:mvファイルを作成しても、ファイルとそれを開いているプログラムとの関係は切断されません(ファイルシステムの境界を越えて移動しない限り、プログラムには元のバージョンの作業が残っています)。
  • プログラムがopen書き込み用のファイルを編集し、ユーザーrmがコマンドラインの最後のファイル名である場合、プログラムはファイルに内容を入れ続けることができますが、閉じるとすぐにそのデータへの参照はなくなり、それは消えます。
  • 1つまたは複数のファイルを介して通信する2つのプログラムは、ファイルの終了後にファイルを削除することにより、おおまかな部分的なセキュリティを取得できますopen。(これは実際のセキュリティの考え方ではありません。単に隙間を競合状態に変換するだけです。)

1
私は@dmckeeに同意します、私はただ注意したかっopenたです:プログラムは読み取りと書き込みのためのファイルにすることができます(問題のログファイルで起こったこととして)。
jsbillings

@jsbillings:はい、しかしリスクがあります。すべてのファイルシステム名がなくなったら、開いているファイルにGBを書き込むことができます。GBを閉じると、朝露のように蒸発します。
dmckee

1
また、iノードはカーネルにコピーされ、ディスクコピーではなく、それが操作されます。そのため、ファイルはmv'dまたはcp 'である可能性がありますが、開いているファイルは、ディスクバージョンではなく、カーネルデータ構造で既に機能しています。したがって、書き込み用に開いているファイルに別のファイルをコピーしても、プロセスは古いファイルと同じ相対位置に書き込みます。これが、Apache httpdのようなプログラムがログファイルを閉じて再度開くシグナルハンドラを持っている理由です。
アルケージュ

0

この動作がどのように実装されているかを実際に確認するには、Unixプログラミングの書籍をご覧ください。数学は、iノードに関連しているという点で正しいです。実際のパス名は、プログラムが開かれたファイル記述子によってそれを参照した後、ファイルを開くためにのみ使用されます。ファイル記述子は順番にiノードを参照します。この場合、基になるファイル名が変更されたかどうかは関係ありません。

Windowsでこれを実装する限り、それは別のサイトの質問です。

本を読むことなくこれについてさらに読むには、Linuxファイルシステムとiノードを検索してください。明確な答えはないかもしれませんが、その理由は理解できます。


4
「あちこち検索してください。おそらく正しい答えは見つかりませんが、理解するでしょう」は良い答えではありません。
mattdm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.