Linux系統程式設計10 硬鏈結與軟鏈結

2022-05-23 14:12:12 字數 2024 閱讀 2544

理解硬鏈結和軟鏈結概念前,需要先了解檔案和inode相關背景知識:

linux系統程式設計5_檔案描述符:

linux系統程式設計9_inode機制:

索引節點(inode)

要了解鏈結,我們首先得了解乙個概念,叫索引節點(inode)。

在linux系統中,核心為每乙個新建立的檔案分配乙個inode(索引結點),每個檔案都有乙個惟一的inode號,我們可以將inode簡單理解成乙個指標,它永遠指向本檔案的具體儲存位置。

檔案屬性儲存在索引結點裡,在訪問檔案時,索引結點被複製到內存在,從而實現檔案的快速訪問。系統是通過索引節點(而不是檔名)來定位每乙個檔案。

儲存在系統的每乙個檔案,系統會對該檔案建立乙個索引節點。

在linux中,多個檔案指向同乙個索引節點是允許的,像這樣的鏈結就是硬鏈結。

硬鏈結是指通過索引節點對檔案的鏈結。

硬鏈結說白了是乙個指標,指向檔案索引節點,系統並不為它重新分配inode。

對於硬鏈結的讀寫和修改等操作和軟鏈結是一樣的。

在硬鏈結中如果刪除原檔案會引起「引用計數」減1的變化,只要「引用計數」不為零,則硬鏈結檔案仍然存在,而且保留了原有的內容 ,這樣就可以防止誤操作刪除原始檔。但是硬鏈結檔案只能在同乙個檔案系統中。

符號鏈結又稱為軟鏈結,和windows的快捷方式相似,符號鏈結檔案中並不包括實際的檔案資料,而只是包括了它指向檔案的路徑。

它可以鏈結到任意檔案和目錄,包括處於不同檔案系統的檔案以及目錄。當使用者對鏈結檔案操作時,系統會自動的轉到對原始檔的操作,但是刪除鏈結檔案時,並不會刪除原始檔。

軟鏈結會真正建立自己的 inode 索引和 block,所以軟鏈結和原始檔的 inode 號是不一致的,

而且在軟鏈結的 block 中,寫的不是真正的資料,而僅僅是指向檔案的檔名及 inode 號。

硬鏈結不能跨檔案系統(分割槽)建立,因為在不同的檔案系統中,inode 號是重新計算的。

硬鏈結不能鏈結目錄,因為如果給目錄建立硬鏈結,那麼不僅目錄本身需要重新建立,

目錄下所有的子檔案,包括子目錄中的所有子檔案都需要建立硬鏈結,這對當前的 linux 來講過於複雜。

硬鏈結不會建立新的 inode 資訊,也不會更改 inode 的總數。

硬鏈結的限制比較多,既不能跨檔案系統,也不能鏈結目錄,而且原始檔和硬鏈結檔案之間除 inode 號是一樣的之外,

ln命令來建立硬鏈結。

ln 原始檔 目標檔案 

ln -s 原始檔 目標檔案

ls -i

//可以檢視inode號碼,inode 號就相當於檔案 id

軟鏈結的標誌非常明顯,首先,許可權位中"l"表示這是乙個軟鏈結檔案;

其次,在檔案的後面通過 "->" 顯示出原始檔的完整名字。所以軟鏈結比硬鏈結的標誌要明顯得多;

而且軟鏈結也不像硬鏈結的限制那樣多,比如軟鏈結可以鏈結目錄,也可以跨分割槽來建立軟鏈結

查詢檔案的步驟:

當我們查詢乙個檔案,比如 /root/test 時,要經過以下步驟:

1、首先找到根目錄的 inode(根目錄的 inode 是系統已知的,inode 號是 2),然後判斷使用者是否有許可權訪問根目錄的 block。

2、如果有許可權,則可以在根目錄的 block 中訪問到 /root 的檔名及對應的 inode 號。

3、通過 /root/ 目錄的 inode 號,可以查詢到 /root/ 目錄的 inode 資訊,接著判斷使用者是否有許可權訪問 /root/ 目錄的 block。

4、如果有許可權,則可以從 /root/ 目錄的 block 中讀取到 test 檔案的檔名及對應的 inode 號。

5、通過 test 檔案的 inode 號,就可以找到 test 檔案的 inode 資訊,接著判斷使用者是否有許可權訪問 test 檔案的 block。

6、如果有許可權,則可以讀取 block 中的資料,這樣就完成了 /root/test 檔案的讀取與訪問。

linux系統程式設計筆記03 軟鏈結和硬鏈結

linux下的軟鏈結行為和windows下的快捷方式差不多,但是如果是用相對路徑建立的軟鏈結,在軟鏈結移動之後就會失效,無法訪問。這一點和windows快捷方式不同,windows快捷方式隨便放 都行。硬鏈結總結 ln s file file.s 建立乙個軟鏈結 軟鏈結就像windows下的快捷方式...

linux系統鏈結 硬鏈結

在linux系統中,鏈結可分為兩種 一種為硬鏈結 hard link 另一種為軟鏈結或符號鏈結 symbolic link or soft link ln這個命令就是建立鏈結檔案的。在預設不帶引數的情況下,執行ln命令建立的鏈結是硬鏈結。如果帶 s建立鏈結則為軟鏈結。硬鏈結是指通過索引節點 inod...

Linux系統程式設計4 編譯鏈結

編譯 的步驟 預處理器 源 經過預處理器處理後變成了修改後的源 主要是處理 符號開頭的特殊行 編譯器 編譯修改後的源 將翻譯後的機器語言指令,也就是目標 儲存在目標檔案中 目標檔案 不是完整的程式,因為它不包含一些必要的執行時庫,所以無法執行 執行時庫 執行一些常規操作或者某些困難任務預先編寫好的 ...