UNIX對文件的處理

「An inode stores all the information about a regular file, directory, or other file system object, except its data and name. 」

每一個文件都對應一個 i 節點,i 節點存儲了除文件名和文件內容以外的全部信息。node

瞭解一下文件系統如何存取文件的:
一、根據文件名,經過Directory裏的對應關係,找到文件對應的Inode number
二、再根據Inode number讀取到文件的Inode table
三、再根據Inode table中的Pointer讀取到相應的Blocks緩存

文件夾也是一種文件,建立的時候須要佔用一個inode,而對應的data block則存目錄的內容,內容則是該目錄下全部文件(文件夾)的名字和對應的inode number。函數

unlink 和 rm 的關係.net

執行unlink()函數並不必定會真正的刪除文件,它先會檢查文件系統中此文件的鏈接數是否爲1,若是不是1說明此文件還有其餘連接對象,所以只對此文件的鏈接數進行減1操做。若鏈接數爲1,而且在此時沒有任何進程打開該文件,此內容纔會真正地被刪除掉。在有進程打開此文件的狀況下,則暫時不會刪除,直到全部打開該文件的進程都結束時文件就會被刪除。指針

  • superblock:記錄此filesystem 的總體信息,包括inode/block的總量、使用量、剩餘量, 以及檔案系統的格式與相關信息等;
  • inode:記錄檔案的屬性,一個檔案佔用一個inode,同時記錄此檔案的資料所在的block 號碼;
  • block:實際記錄檔案的內容,若檔案太大時,會佔用多個block 。

在讀取一個文件時,老是從根目錄開始讀取,每個目錄或者文件,在VFS中,都是一個文件對象,每個文件對象都有惟一的一個inode與之對應。根目錄的inode號爲0,在superblock裏,能夠很快根據inode號索引到具體的inode,所以讀取到的第一個inode就是根目錄的。讀取到了該目錄後,內核對象會爲該文件對象創建一個dentry,並將其緩存起來,方便下一次讀取時直接從內存中取。而目錄自己也是一個文件,目錄文件的內容便是該目錄下的文件的名字與inode號,目錄文件的內容就像一張表,記錄的文件名與其inode no.之間的映射關係。根據路徑便可找到當前須要讀取的下一級文件的名字和inode,同時繼續爲該文件創建dentry,dentry結構是一種含有指向父節點和子節點指針的雙向結構,多個這樣的雙向結構構成一個內存裏面的樹狀結構,也就是文件系統的目錄結構在內存中的緩存了。有了這個緩存,咱們在訪問文件系統時,一般都很是快捷。code

link 和 cp 的關係
拷貝文件(cp)會從新建立一個文件而且複製相同的內容,
佔用新的空間,新的inode,這是兩個文件
而硬連接其實是增長了原來文件的count,並建立了一個鏈接,當你刪除一個源文件或者一個硬連接後,count減1,到0後刪除文件。orm

cp對inode的影響:對象

1. 當複製行爲發生的時候,系統會找到一個空inode number,而後將數據寫入到inode table 

2. 而且會新增一個目錄,把文件的檔案名稱對應到inode number 

3. 當inode number和inode table處理好了以後,系統纔會將文件內容複製到新增的文件中

mv對inode的影響:blog

前提:使用mv命令搬移的文件目的地跟原文件在同一文件系統內索引

1. 系統會新建一個目錄項,將新檔案名稱對應到inode number 

2. 刪除舊檔案

(搬移檔案的行爲對inode table沒有任何影響,也不會將檔案搬移到其餘的block)

rm對inode的影響:

1. 系統會減去文件的link count數字,而後將對應的inode number標記爲可以使用

2. 而文件所佔用的block也會打上可使用的「標籤」

3. 最後移除文件名稱和目錄項

 ============================================

PS:

當咱們使用rm命令的時候,系統並不會真正刪除這個資料。除非有檔案非要將資料存儲在原來檔案的這些block中。這    樣原來的block就會被新檔案給覆蓋掉。 

 =============================================

https://blog.csdn.net/lqt641/...

相關文章
相關標籤/搜索