硬鏈結與符號鏈結

2021-06-14 02:33:40 字數 3779 閱讀 9750

乙個inode節點可以存在任意數目的硬鏈結。在刪除硬鏈結時,該inode節點上的資料上的資料將不會受到影響。在linux系統中可以使用ln命令來建立硬鏈結。首先用touch命令建立名為link.test的檔案。然後,輸入「ln link.test link」命令,這時就建立了指向link.test的硬鏈結。通過「ls –i」命令可以看到這兩個檔案的inode節點值是一致的。

刪除link.test檔案,依然發現硬鏈結link檔案指向了inode節點。也就是說,該inode節點資料沒有被刪除,因此,要刪除存在硬鏈結的檔案的資料時,除了刪除檔案本身,還必須刪除所有的硬鏈結。

硬鏈結依賴於inode節點而存在,在linux系統中,硬鏈結存在以下幾點侷限性:

(1):只有檔案才可以建立硬鏈結,目錄不可以建立硬鏈結。

(2):硬鏈結不能跨越檔案系統。不能給處在不同檔案系統(這裡是指不同分割槽上的檔案)建立硬鏈結。

在linux系統中,使用最多的是符號鏈結。符號鏈結是一種專門的檔案型別,與硬鏈結不同,符號鏈結通過名稱來指向另乙個檔案。因此,不會出現像硬鏈結中檔案和鏈結指向同乙個inode的情況。符號鏈結也不會影響檔案的刪除,如果檔案消失了,那麼符號鏈結將變得不可用。使用「ln -s」來建立符號鏈結。

符號鏈結要比硬鏈結靈活的多。在linux系統中,可以給任何型別的檔案系統建立符號鏈結。

特點

硬鏈結

符號鏈結

名稱解析情況

較快,因為硬鏈結中包含對鏈結物件的直接引用

較慢,符號鏈結包含鏈結物件的路徑名。因此,必須解析路徑名稱才可以找到鏈結的物件

鏈結物件

鏈結物件必須存在才可以建立硬鏈結

鏈結物件不一定存在,不存在的時候可以一樣可以建立符號鏈結

是否要求存在乙個分割槽中

要求在同乙個分割槽中

不要求,符號鏈結可以跨越不同的檔案系統

刪除鏈結物件的要求

無要求,刪除鏈結物件後,符號鏈結給出指向錯誤而已

link函式用於建立硬鏈結。該函式的具體資訊如下表所示:

link函式

標頭檔案

函式形式

int link(const char *oldpath, const char  *newpath)

返回值 成功

失敗是否設定errno0

-1 設定

說明:這裡建立的鏈結為硬鏈結,呼叫引數主要是原有的檔名稱和建立的鏈結名稱。與使用ln建立硬鏈結類似,建立的鏈結時不能跨越檔案系統的,且oldpath或newpath不能為目錄。

錯誤資訊:

eacces:程序沒有許可權在新的目錄中寫入檔案,或給出的檔案所處路徑沒有訪問許可權。

eexist:給出的newpath已經存在檔案。

efault:oldpath或newpath指向非法位址空間。

eio:發生i/o讀寫錯誤。

eloop:給出的檔案所在路徑中符號鏈結過多。

emlink:執行oldpath的鏈結已經達到最大限度。

enametoolong:oldpath或newpath長度過長。

enoent:oldpath或newpath中的目錄存在問題或是空的符號鏈結。

enomem:核心空間不足。

enospc:磁碟空間不足,無法建立新的目錄項。

enotdir:給出的檔案所處路徑中含有不是目錄的部分。

eperm:oldpath為目錄。

eperm:包含oldpath和newpath的檔案系統不支援建立硬鏈結。

erofs:檔案位於唯讀檔案系統上。

exdev:oldpath和newpath沒有處在同乙個掛載的檔案系統上。

例項:

#include #include int main(void)

return (0);

}

linux系統還提供了unlink函式,用於刪除建立的硬鏈結。unlink函式的具體資訊如下表所示:

unlink函式

標頭檔案

函式形式

int unlink(const char *pathname);

返回值 成功

失敗是否設定errno0

-1 設定

說明:unlink函式刪除pathname指向的鏈結。如果鏈結計數器為0,同時沒有程序開啟了該檔案,unlink將釋放檔案所占用的空間。

錯誤資訊:

eacces:程序沒有許可權在新的目錄中寫入檔案,或給出的檔案所處路徑沒有訪問許可權。

ebusy:系統或其他程序使用了該鏈結,無法刪除。

efault:路徑指向非法位址空間。

eio:發生i/o讀寫錯誤。

eloop:給出的檔案所在路徑中符號鏈結過多。

enametoolong:路徑過長。

enoent:路徑中的目錄存在問題或是空的符號鏈結。

enomem:核心空間不足。

enospc:磁碟空間不足,無法建立新的目錄項。

enotdir:給出的檔案所處路徑中含有不是目錄的部分。

eperm:系統不充許刪除目錄或者沒有刪除目錄的許可權。

erofs:檔案位於唯讀檔案系統上。

eisdir:路徑指向乙個目錄。

例項:

#include #include int main(void)

return (0);

}

通過使用symlink函式,可以達到與「ln -s」命令的相同的結果,即建立符號鏈結。symlink函式的具體定義如表:

symlink函式

標頭檔案

函式形式

int symlink(const char *oldpath, const  char *newpath)

返回值 成功

失敗是否設定errno0

-1 設定

說明:symlink函式中,oldpath為鏈結要指向的目標,而newpath為建立的鏈結名稱。

錯誤資訊:

eacces:程序沒有許可權在新的目錄中寫入檔案,或給出的檔案所處路徑沒有訪問許可權。

eexist:給出的newpath已經存在檔案。

efault:oldpath或newpath指向非法位址空間。

eio:發生i/o讀寫錯誤。

eloop:給出的檔案所在路徑中符號鏈結過多。

enametoolong:oldpath或newpath長度過長。

enoent:newpath中的目錄存在問題或是空的符號鏈結。

enomem:核心空間不足。

enospc:磁碟空間不足,無法建立新的目錄項。

enotdir:給出的檔案所處路徑中含有不是目錄的部分。

eperm:包含newpath的檔案系統不支援建立符號鏈結。

erofs:檔案位於唯讀檔案系統上。

例項:

#include #include int main(void)

return (0);

}

符號鏈結的刪除依然使用前面介紹的unlink函式實現。

硬鏈結與符號鏈結

索引節點 inode 要 了解鏈結,我們首先得了解乙個概念,叫索引節點 inode 在linux系統中,核心為每乙個新建立的檔案分配乙個inode 索引結點 每個檔案 都有乙個惟一的inode號,我們可以將inode簡單理解成乙個指標,它永遠指向本檔案的具體儲存位置。檔案屬性儲存在索引結點裡,在訪問...

硬鏈結與符號鏈結

我們首先來了解一下幾個名詞。索引節點 inode 要了解鏈結,我們首先得了解乙個概念,叫索引節點 inode 在linux系統中,核心為每乙個新建立的檔案分配乙個inode 索引結點 每個檔案都有乙個惟一的inode號,我們可以將inode簡單理解成乙個指標,它永遠指向本檔案的具體儲存位置。檔案屬性...

硬鏈結與符號鏈結

我們首先來了解一下幾個名詞。索引節點 inode 要了解鏈結,我們首先得了解乙個概念,叫索引節點 inode 在linux系統中,核心為每乙個新建立的檔案分配乙個inode 索引結點 每個檔案都有乙個惟一的inode號,我們可以將inode簡單理解成乙個指標,它永遠指向本檔案的具體儲存位置。檔案屬性...