乙個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簡單理解成乙個指標,它永遠指向本檔案的具體儲存位置。檔案屬性...