linux正統的檔案系統(如ext2、ext3)中,乙個檔案由目錄項、inode和資料塊組成。
目錄項:包括檔名和inode節點號。
inode:又稱檔案索引節點,是檔案基本資訊的存放地和資料塊指標存放地。
其中檔案基本資訊包括:檔案的長度、檔案在磁碟上的存放的位置、檔案建立、修改的日期和它的訪問許可權等資訊。
資料塊:檔案的具體內容存放地。
linux正統的檔案系統(如ext2、3等)中,硬碟分割槽時會劃分出目錄塊、inode table區塊和data block資料區域。乙個檔案由乙個目錄項、inode和資料區域塊組成。inode包含檔案的屬性(如讀寫屬性、owner等,以及指向資料塊的指標),資料區域塊則是檔案內容。當檢視某個檔案時,會先從inode table中查出檔案屬性及資料存放點,再從資料塊中讀取資料。
其中目錄項的結構如下(每個檔案的目錄項儲存在該檔案所屬目錄的檔案內容裡):
其中檔案的inode結構如下(inode裡所包含的檔案資訊可以通過stat filename檢視得到):
以上只反映大體的結構,linux檔案系統本身在不斷發展。但是以上概念基本是不變的。且如ext2、ext3、ext4檔案系統也存在很大差別,如果要了解可以檢視專門的檔案系統介紹。
l 硬連線:是給檔案乙個副本,同時建立兩者之間的連線關係。修改其中乙個,與其連線的檔案同時被修改。如果刪除其中任意乙個其餘的檔案將不受影響。
l 軟連線: 也叫符號連線,他只是對原始檔在新的位置建立乙個「快捷(借用一下windows常用詞)」,所以,當原始檔刪除時,符號連線的檔案將成為無源之水->僅僅剩下個檔名了,當然刪除這個連線,也不會影響到原始檔,但對連線檔案的使用、引用都是直接呼叫原始檔的。
注:我覺得原始檔應該是hello.c
硬鏈結原檔案和新檔案的inode編號一致。而軟鏈結不一樣。
對原檔案刪除,會導致軟鏈結不可用,而硬鏈結不受影響。(可能是因為刪除乙個檔案只是刪除了這個檔案的目錄項,它的inode和資料塊依然存在)
對原檔案的修改,軟、硬鏈結檔案內容也一樣的修改,因為都是指向同乙個檔案內容的。
3、 檔案描述符和開啟檔案之間的關係:
每乙個檔案描述符會與乙個開啟檔案相對應,同時,不同的檔案描述符也會指向同乙個檔案。相同的檔案可以被不同的程序開啟也可以在同乙個程序中被多次開啟。系統為每乙個程序維護了乙個檔案描述符表,該錶的值都是從0開始的,所以在不同的程序中你會看到相同的檔案描述符,這種情況下相同檔案描述符有可能指向同乙個檔案,也有可能指向不同的檔案。具體情況要具體分析,要理解具體其概況如何,需要檢視由核心維護的3個資料結構。
1. 程序級的檔案描述符表
2. 系統級的開啟檔案描述符表
3. 檔案系統的i-node表
程序級的描述符表的每一條目記錄了單個檔案描述符的相關資訊。
1. 控制檔案描述符操作的一組標誌。(目前,此類標誌僅定義了乙個,即close-on-exec標誌)
2. 對開啟檔案控制代碼的引用
核心對所有開啟的檔案維護有乙個系統級的描述符**(open file description table)。有時,也稱之為開啟檔案表(open file table),並將**中各條目稱為開啟檔案控制代碼(open file handle)。乙個開啟檔案控制代碼儲存了與乙個開啟檔案相關的全部資訊,如下所示:
1. 當前檔案偏移量(呼叫read()和write()時更新,或使用lseek()直接修改)
2. 開啟檔案時所使用的狀態標識(即,open()的flags引數)
3. 檔案訪問模式(如呼叫open()時所設定的唯讀模式、只寫模式或讀寫模式)
4. 與訊號驅動相關的設定
5. 對該檔案i-node物件的引用
6. 檔案型別(例如:常規檔案、套接字或fifo)和訪問許可權
7. 乙個指標,指向該檔案所持有的鎖列表
8. 檔案的各種屬性,包括檔案大小以及與不同型別操作相關的時間戳
下圖展示了檔案描述符、開啟的檔案控制代碼以及i-node之間的關係,圖中,兩個程序擁有諸多開啟的檔案描述符。
在程序a中,檔案描述符1和30都指向了同乙個開啟的檔案控制代碼(標號23)。這可能是通過呼叫dup()、dup2()、fcntl()或者對同乙個檔案多次呼叫了open()函式而形成的。
程序a的檔案描述符2和程序b的檔案描述符2都指向了同乙個開啟的檔案控制代碼(標號73)。這種情形可能是在呼叫fork()後出現的(即,程序a、b是父子程序關係),或者當某程序通過unix域套接字將乙個開啟的檔案描述符傳遞給另乙個程序時,也會發生。再者是不同的程序獨自去呼叫open函式開啟了同乙個檔案,此時程序內部的描述符正好分配到與其他程序開啟該檔案的描述符一樣。
此外,程序a的描述符0和程序b的描述符3分別指向不同的開啟檔案控制代碼,但這些控制代碼均指向i-node表的相同條目(1976),換言之,指向同乙個檔案。發生這種情況是因為每個程序各自對同乙個檔案發起了open()呼叫。同乙個程序兩次開啟同乙個檔案,也會發生類似情況。
總結由於程序級檔案描述符表的存在,不同的程序中會出現相同的檔案描述符,它們可能指向同乙個檔案,也可能指向不同的檔案。
兩個不同的檔案描述符,若指向同乙個開啟檔案控制代碼,將共享同一檔案偏移量。因此,如果通過其中乙個檔案描述符來修改檔案偏移量(由呼叫read()、write()或lseek()所致),那麼從另乙個描述符中也會觀察到變化,無論這兩個檔案描述符是否屬於不同程序,還是同乙個程序,情況都是如此。
檔案描述符標誌(即,close-on-exec)為程序和檔案描述符所私有。對這一標誌的修改將不會影響同一程序或不同程序中的其他檔案描述符。
作業系統為每個執行的程序維護一張單獨的檔案描述符表。當程序開啟乙個檔案時,系統把乙個指向此檔案內部資料結構的指標寫入檔案描述符表,並把該錶的索引值返回給呼叫者。也就是說,檔案描述符表中儲存的乙個個的指標,該指標指向對應的描述該檔案的結構體,而系統返回給我的檔案描述符實際上標識了該指標在檔案描述符表中的位置,也就是索引。
而file結構體,是為了是使用者更方方便、高效地操作檔案而定義的結果題,它主要包含兩部分,乙個就是檔案描述符,另乙個就是buffer緩衝區,有了這個緩衝區,就可以一次寫入乙個序列,而不是乙個位元組乙個位元組去寫了,這樣可以提高效率。
Linux檔案許可權知識
linux系統以安全性高著稱,它有完善的檔案和目錄許可權控制機制。使用ls l或者ll命令可檢視系統中檔案和目錄的許可權。如 root user ll rw r r 1 root root 50883 may 12 13 16 install.log rw r r 1 root root 3065 ...
Linux檔案許可權知識
如何檢視linux中的檔案許可權 root localhost test ll d test drwxr xr x.2 root root 52 8月 7 20 18 test 上面的rwxr xr x即為檔案的許可權位共九位。下面分別對其進行介紹。rwx r x r x 屬主屬組 其他人前三個為屬...
Linux面試總結知識點
1.一台主機要實現通過區域網與另乙個區域網通訊,需要做的工作是?定義一條本機指向目標網路閘道器的路由 2.下列關於檔案系統中元資料 比如ext2中的inode 的基本作用及ext2和ext3的根本區別描述錯誤的有?b a.ext2 inode用來定義檔案系統的結構以及描述系統中每個檔案的管理資訊,每...