Linux
文件刪除與覆蓋和連結在 /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 仍然能夠訪問文件的原始內容。為什麼會有這種差異?
$$ 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。你看到了什麼不同的東西嗎?