Files

核心是否會保存某個程序正在寫入的整個文件

  • October 14, 2020

提出這個問題後,我對 linxu 核心的行為感到有些困惑。

首先,我知道程序如何將字元串寫入文件:程序會獲得一些緩衝區,緩衝區可以由程序寫入,一旦緩衝區滿或程序刷新緩衝區,緩衝區的內容將是寫入文件的數據塊。例如,在 C 的程序中,當我們printfa時\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 上恢復。

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