文章目錄
- 文件的軟硬鏈接
- 軟鏈接
- 硬鏈接
- 軟硬鏈接對比
- 軟硬鏈接應用
- 軟硬鏈接注意事項
- 總結
文件的軟硬鏈接
本篇文章將重點講解文件系統中的一個重要的知識點:
即文件的軟硬鏈接。
軟鏈接
對于軟鏈接的講解,我們先來使用一個指令看看效果:ln -s 被軟鏈接的文件 鏈接的文件:
運行代碼:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[]) {if (argc != 2) {fprintf(stderr, "Usage: %s <directory>\n", argv[0]);exit(EXIT_FAILURE);}DIR *dir = opendir(argv[1]); // 系統調用,自行查閱if (!dir) {perror("opendir");exit(EXIT_FAILURE);}struct dirent *entry;while ((entry = readdir(dir)) != NULL) { //系統調用,自行查閱// Skip the "." and ".." directory entriesif (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {continue;}printf("Filename: %s, Inode: %lu\n", entry->d_name, (unsigned long)entry->d_ino);
}closedir(dir);return 0;
}
我們在當前目錄下,使用該指令,把當前目錄下的TestDir目錄進行軟鏈接,鏈接的名為DIR,我們打開查看當前目錄下的文件,發現多了一個文件叫做DIR。
而且,這個文件的類型標識符是l,表示是一個鏈接文件。
我們試著使用一下這個鏈接文件:
我們發現,是可以把這個DIR當作成可執行文件來用的,因為鏈接的就是一個可執行文件!
我們來看看被鏈接的文件和鏈接文件的區別:
我們會發現,軟鏈接文件DIR是有獨立的inode編號的!也就是說,它是一個獨立的文件!
硬鏈接
有軟鏈接,就有硬鏈接。
使用指令ln 被鏈接文件 鏈接文件即可完成對文件的硬鏈接:
硬鏈接文件是DIR_HARD。我們發現,這個文件和被鏈接文件的inode編號都是一樣的,都是666187,這說明:硬鏈接的文件本質上就不是一個獨立的文件!因為沒有獨立的inode編號!
軟硬鏈接對比
前面我們講解了軟硬鏈接的使用,也介紹了軟硬鏈接的一些特點,接下來,我們來對比一下:
首先,軟硬鏈接的本質區別就是:
軟鏈接的文件具有獨立的inode編號!所以是一個獨立的文件。而硬鏈接的文件不是。
對于軟鏈接,它里面的內容是什么呢?
其實就是保存了被軟鏈接的文件的路徑!在別的地方進行軟鏈接,調用的時候通過這個保存的路徑來找到文件并且做相應操作。
這不就是Windows系統下的快捷方式嗎?
這個所謂的目標,其實就是運行該軟件的可執行程序!
因為這些可執行程序有可能會藏得很深,如果每次運行都要去找是很麻煩的。所以,就可以使用軟鏈接的方式,保存目標文件路徑。使用的時候就是通過這個路徑來使用。
而硬鏈接,由于它沒有獨立的inode,所以硬鏈接的文件不是獨立的文件。那它是什么呢?
其實就是當前目錄下和被硬鏈接文件所處目錄下都添加了一份:inode和硬鏈接文件的名的映射關系罷了,只不過這個inode,是和被鏈接文件一樣的!
所以,這個行為本質上就是在給文件做副本。刪除文件時,通過引用計數來判斷當前inode使用的次數,來決定是否需要完全刪除文件。
所以,硬鏈接是可以用來做備份工作的!
軟硬鏈接應用
這里來講一個我們一直在用,但是卻不知道其中管理的內容。
即當前目錄.
和上級目錄..
其實所謂的當前目錄.
和上級目錄..
就是目錄的硬鏈接罷了!
我們來驗證一下:
驗證當前目錄.
:
驗證上級目錄..
:
經過驗證,確實發現,文件系統其實對當前目錄.
和上級目錄..
進行了硬鏈接操作。也就是說,保存了當前目錄下的內容和上級目錄的內容。
這也就是為什么我們使用當前目錄.
和上級目錄..
可以正常操作當前目錄和上級目錄了!效果和直接使用目錄名一致!
軟硬鏈接注意事項
但是,這里要說的是:
在Linux系統下,是不允許用戶對目錄進行硬鏈接的!
但是,當前目錄.
和上級目錄..
就是對目錄進行的硬鏈接。這是操作系統自動進行的!其余情況下,不允許用戶進行對目錄的硬鏈接。
這里我們來稍微解釋一下:
其實是因為,系統中的文件搜索路徑是一個文件樹!如果對目錄進行硬鏈接的話,那么會導致形成路徑環!假設現在搜索某個文件,對搜到了一個硬鏈接的目錄。這時候就麻煩了,如果硬鏈接到根目錄,搜著搜著就回到了根目錄下去了。
這嚴重影響了操作系統對于文件的搜索效率!但是,操作系統對上級目錄和當前目錄進行硬鏈接,不也是形成路徑環嗎?
這不用擔心,這兩個硬鏈接文件名字非常特殊,判斷后做特殊處理即可。
操作系統選擇硬鏈接當前路徑和上級路徑,其實是為了用戶能夠操作起來更加方便!
總結
至此,到這里我們就把Ext2文件系統的絕大部分相關知識介紹完了。當然,Linux系統下還存在著多個文件系統,如Ex3,Ext4,xfs…
但是,對于Ext系列的文件系統來說,主要邏輯還是相通的,只是在個別地方的操作會有進行優化。其它的文件系統如果感興趣也可以上網查閱資料。