文件删除与覆盖并链接到 /proc/pid/fd

文件删除与覆盖并链接到 /proc/pid/fd

众所周知,UNIX 系统实际上不会在磁盘上的文件正在使用时删除该文件。因此,如果进程 1 正在访问某个文件,并且进程 2 使用 rm 删除该文件,则进程 1 会继续查看该文件;另外,位于 /proc/(process 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

如果进程 1 在进程 2 覆盖该文件之前已经开始读取该文件,那么它会将部分内容存储在缓冲区中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 中的情况。你看到了什么不同的东西吗?

相关内容