UNIX文件:硬鏈接和符號鏈接

UNIX目錄中有2中類型的鏈接——硬鏈接和符號鏈接。
 
硬鏈接本身就是一個目錄項,(比如文件名+索引節點號),可以將文件名與文件的位置關聯起來;
符號鏈接也稱軟鏈接,是指存儲了一個字符串的文件。這個字符串可以在路徑名解析的過程中,用於修改路徑名。
 
----------------------------------------------------
  假設文件是用索引節點來表示的
----------------------------------------------------
 
目錄項對應於單個鏈接,但是一個索引節點可能有幾個鏈接的目標(對應幾個目錄項),因此索引節點中包含一個對鏈接到索引節點的鏈接數的計數。當用open()創建一個新的文件時,操作系統就會創建一個新的目錄項,並分配一個空閒的索引節點來表示該文件。
                                                       圖 1
圖1顯示的就是/dirA下的name1文件的目錄項,索引節點爲12345,有一個鏈接,它的第一個數據塊爲23567。 文件很小,所有內容都包含在一個塊中。
 
(1)創建一個硬鏈接
可以使用命令ln或者函數link()爲文件創建一個鏈接。
 
#include <unistd.h>
int link( const char *path1, const char *path2 );
 
上述操作爲path1指定的一個已經存在的文件(比如/driA/name1)創建一個新的目錄項,這個文件位於path2指定的目錄下(比如/driB/name2);並增加相應的索引節點鏈接計數,不再使用額外的磁盤空間。
如圖2:
                                                 圖 2
(2) 創建一個符號鏈接
符號鏈接是一個包含了另一個文件或目錄名字的文件。引用符號鏈接的名字會使操作系統去定位對應於那個鏈接的索引節點,知道最終遇到一個硬間接和一個真正的文件爲止。如果過了一段時間,系統沒有找到文件,則放棄並返回ELOOP錯誤。
 
使用ln命令帶選項-s 或者函數symlink(),都可以創建符號鏈接。
 
#include <unistd.h>
int symlink ( const char *path1, const char *path2);
 
這裏path2是新創建的鏈接,新鏈接指向path1 。如圖3:
                                                                       圖 3
 
這裏,符號鏈接使用了一個新的索引節點(13579),該索引節點包含了說明它是一個符號鏈接的信息。符號鏈接至少需要一個數據塊(如15213),數據塊中包含了/dirB/name2要鏈接的文件名稱,這裏即爲/dirA/name1。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章