Linux

文件刪除與覆蓋和連結在 /proc/pid/fd

  • October 18, 2012

眾所周知,UNIX 系統實際上不會在文件正在使用時刪除磁碟上的文件。因此,如果程序 1 正在訪問一個文件,而程序 2 使用 rm 刪除了該文件,則程序 1 繼續查看該文件;此外,/proc/(process 1 id)/fd 處的文件描述符連結報告已刪除文件的原始內容。

但是,如果程序 2 覆蓋文件而不是刪除文件(例如使用 echo “abracadabra” > file.txt),則 /proc/(process 1 id)/fd 處的文件描述符連結會報告覆蓋材料(“abracadabra”) ,而程序 1 仍然能夠訪問文件的原始內容。為什麼會有這種差異?

$$ Edit $$下面的片段是對吉姆巴黎的回應

>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 覆蓋文件之前已經開始讀取文件,那麼它將有一部分內容儲存在stdio緩衝區中。一旦它越過緩衝區大小邊界,它將被迫進入核心,然後它會找到新的覆蓋內容。

但是,如果程序 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。你看到了什麼不同的東西嗎?

引用自:https://unix.stackexchange.com/questions/52115