ファイルの削除、上書き、および/proc/pid/fdへの接続

ファイルの削除、上書き、および/proc/pid/fdへの接続

UNIXシステムが使用しているディスク上のファイルを実際に削除しないことはよく知られています。したがって、プロセス 1 がファイルにアクセスし、プロセス 2 が rm を使用してファイルを削除すると、プロセス 1 はファイルをさらに表示します。 /proc/(プロセス 1 id)/fd のファイル記述子リンクは、そのファイルが削除されたことを報告します。ファイルの元の内容を削除します。

ただし、プロセス2がファイルを削除するのではなくファイルを上書きする場合(例:echo "abracadabra"> file.txtを使用)、/proc/(process 1 id)/ fdのファイル記述子リンクは上書きデータ(「abracadabra」) )を報告します。プロセス1はまだファイルの元のコンテンツにアクセスできます。なぜそのような違いがありますか?

[編集] 次のクリップはJim Parisへの対応です。

>uname -a
Linux ravoori-netbook 3.2.0-32-generic-pae #51-Ubuntu SMP Wed Sep 26 21:54:23 UT
C 2012 i686 i686 i386 GNU/Linux
>echo original > /tmp/foo
>tail -0f /tmp/foo &
[2] 6144
>rm /tmp/foo
>cat /proc/6144/fd/3
original
>echo abracadabra > /tmp/foo
>cat /proc/6144/fd/3
original

答え1

プロセス2がファイルを上書きする前にプロセス1がファイルの読み取りを開始した場合は、内容の一部をバッファに保存しますstdio。バッファサイズの境界を超えると、カーネルに強制的に入り、新しいオーバーレイコンテンツを探します。

答え2

ただし、プロセス2がファイルを削除するのではなくファイルを上書きする場合(例:echo "abracadabra"> file.txtを使用)、/proc/(process 1 id)/ fdのファイル記述子リンクは上書きデータ(「abracadabra」) )を報告します。プロセス1は依然​​としてソースファイルの元のコンテンツにアクセスできます。

私は同意しません:

$ echo original > /tmp/foo
$ tail -0f /tmp/foo &
[1] 20591
$ rm /tmp/foo
$ cat /proc/20591/fd/3
original
$ echo abracadabra > /tmp/foo
$ cat /proc/20591/fd/3
original

リンクfdには、あなたが主張するものとは異なり、元のコンテンツは引き続き表示されます。 Linux 3.5の場合です。何か違うのが見えますか?

関連情報