要理解軟鏈接和硬鏈接需要首先理解文件系統(tǒng)的原理刻蟹,這里以EXT2文件系統(tǒng)為例。
Ext2文件系統(tǒng)由3部分組成:
super block
記錄此文件系統(tǒng)的整體信息涩赢,包括 inode/block 的總量,使用量,剩余量染坯。以及文件系統(tǒng)的格式與相關(guān)信息。
inode
一個文件占用一個inode丘逸,記錄文件的屬性和權(quán)限等单鹿,同時也記錄此文件的數(shù)據(jù)所在的block號碼。
block
實(shí)際記錄文件內(nèi)容深纲,若文件太大時仲锄,會占用多個block劲妙。
每個inode和block都有編號,而每個文件都會占用一個inode儒喊,同時記錄此文件數(shù)據(jù)所在的block號碼镣奋。因此,我們知道一個一個文件的inode怀愧,也就自然知道這個文件所放置數(shù)據(jù)的block號碼侨颈,當(dāng)然也就能夠讀出文件的實(shí)際數(shù)據(jù)。
鏈接文件
Linux下的鏈接文件有2種:
hard link(硬鏈接)
使用命令:ln 源文件 目標(biāo)文件
我們知道文件名只與目錄有關(guān)掸驱,但是文件內(nèi)容則與 inode 有關(guān)肛搬。硬鏈接就是多個文件名對應(yīng)同一個inode。
- hard link 只是在某個目錄下的 data block多寫入一個:文件名->inode毕贼,它不會消耗 inode 也不會消耗 block温赔。
- 它不能跨文件系統(tǒng)
- 它不能鏈接到目錄
symbolic link(符號連接,也即是軟鏈接)
使用命令:ln -s 源文件 目標(biāo)文件
symbolic link 就是在創(chuàng)建一個獨(dú)立的文件鬼癣,而這個文件里的數(shù)據(jù)就是它鏈接的那個文件的文件名陶贼。
readlink
-
readlink 命令
readlink 命令輸出符號鏈接值或指向的源文件名(通常使用的是 -f 參數(shù))
readlink命令.png - readlink函數(shù)
#include<unistd.h> ssize_t readlink(const char *path, char *buf, size_t bufsiz);
readlink()
會將參數(shù)path的符號鏈接內(nèi)容存儲到參數(shù)buf所指的內(nèi)存空間。
注意:返回的內(nèi)容不是以\0
作字符串結(jié)尾待秃,但會將字符串的字符數(shù)返回拜秧。
失敗返回 -1,并設(shè)置errno
章郁。
參考資料
1枉氮、https://www.cnblogs.com/kwdeblog/p/11413756.html
2、https://blog.csdn.net/qq_41982304/article/details/82263478
3暖庄、https://blog.csdn.net/qq_16209077/article/details/51974359