核心是否會保存某個程序正在寫入的整個文件
提出這個問題後,我對 linxu 核心的行為感到有些困惑。
首先,我知道程序如何將字元串寫入文件:程序會獲得一些緩衝區,緩衝區可以由程序寫入,一旦緩衝區滿或程序刷新緩衝區,緩衝區的內容將是寫入文件的數據塊。例如,在 C 的程序中,當我們
printf
a時\n
,它會刷新緩衝區。現在,讓我們考慮上面文章中的情況:一個程序打開了一個文件並正在寫入文件,而該文件被命令刪除
rm
。據我了解,該命令
rm
將取消連結文件,這意味著其 inode 及其數據塊將被標記為UNUSED
. 所以我們不能再通過文件名訪問它了。如果一個程序打開一個文件,核心將創建一個文件描述符來訪問它。所以如果我是對的,
rm
一個程序正在寫入的文件不會導致程序的任何錯誤,因為程序可以通過文件描述符訪問文件。正如該文章的評論中提到的那樣,我們仍然可以通過cat /proc/<pid>/fd/3
.現在我很困惑。
cat /proc/<pid>/fd/3
如果在 inode 和數據被標記為UNUSED
因為 的情況下我們仍然可以訪問文件rm
,是否意味著核心會將整個文件保存在 RAM 中?如果是這樣,如果文件非常大,例如一些日誌文件,是否意味著會使用大量 RAM?總之,如果一個文件沒有被
rm
編輯,一個程序可以將東西寫入緩衝區,一旦緩衝區被刷新,它的內容將被寫入文件的數據塊。但是如果一個文件已經被rm
編輯,它的數據塊將被標記為UNUSED
但是一個程序仍然可以寫入它。這是哪裡的“它”?
據我了解,該命令
rm
將取消連結文件,這意味著其 inode 及其數據塊將被標記為UNUSED
.這是理解這裡發生了什麼的關鍵:
rm
只要求核心刪除給定的目錄條目。如果目錄條目指向的 inode 不再被其他任何東西(其他目錄條目、打開的文件描述、文件映射、循環掛載等)引用,核心也會釋放該 inode 和相關數據。因此核心不需要保留被刪除文件的數據:它仍然存在,無論文件系統保存它的位置。只要一個程序擁有一個指向它的文件描述符,它就會一直存在,並且可以
/proc/.../fd/...
在 Linux 上恢復。