《文件系統研究之二》中提到了文件名是文件i節點的鏈接,也就是說一個i節點可以有多個鏈接,即多個文件名,這種鏈接就是所謂的硬鏈接。除了硬鏈接之外,unix下還有另一種鏈接,稱之為符號鏈接。
硬鏈接用ln命令創建,符號鏈接用ln -s創建。
開始之前,先實踐一把,在scounix試驗如下命令:
538# echo "test" >abc
539# l -i abc
65542 -rw-r--r-- 1 root sys 5 Jul 5 04:54 abc
540# ln abc abcnew
541# ln -s abcnew abcs
542# l -i abc*
65542 -rw-r--r-- 2 root sys 5 Jul 5 04:54 abc
65542 -rw-r--r-- 2 root sys 5 Jul 5 04:54 abcnew
65542 -rw-r--r-- 2 root sys 5 Jul 5 04:54 abcs@
可以看到:
1、文件abcnew跟abc的大小,i節點完全一致;
2、文件abcs跟abcnew的大小,i節點也一致(注意:abcs的真實i節點並不是65542,後面可以看到,這是l程序的原因)
3、注意第三列的數字2,代表該i節點有2個鏈接,不是3個。
試驗二:
558# echo "test2">>abcnew
559# cat abc
test
test2
560# l -ia abc*
65542 -rw-r--r-- 2 root sys 11 Jul 5 05:06 abc
65542 -rw-r--r-- 2 root sys 11 Jul 5 05:06 abcnew
65542 -rw-r--r-- 2 root sys 11 Jul 5 05:06 abcs@
561# rm abc
562# l -ia abc*
65542 -rw-r--r-- 1 root sys 11 Jul 5 05:06 abcnew
65542 -rw-r--r-- 1 root sys 11 Jul 5 05:06 abcs@
可以看到:
1、修改abcnew,abc同樣大小變化,內容也同樣變化;
2、刪除abc,不會刪除abcnew,但是鏈接數變成1。
試驗三:
563# rm abcnew
564# l -ia abc*
65543 lrwxrwxrwx 1 root sys 6 Jul 5 05:06 abcs@
565# cat abcs
cat: cannot open abcs: No such file or directory (error 2)
567# echo "test3" >abcnew
568# cat abcs
test3
569# l -ia abc*
65542 -rw-r--r-- 1 root sys 6 Jul 5 05:39 abcnew
65542 -rw-r--r-- 1 root sys 6 Jul 5 05:39 abcs@
可以看到:
1、刪除abcnew,abcs還是不會被刪除;
2、這裡可以看出abcs的真實的i節點及大小。
3、重建abcnew之後,abcs指向了新的abcnew(i節點內容都變了)。
通過以上試驗看出:
硬鏈接典型的特征就是,所有文件的i節點號是一樣的;硬鏈接不是文件拷貝,只是增加了一個i節點鏈接(或者說增加了一個入口指針),所有的硬鏈接都是權力(權限,大小)均等的,修改任意一個,其他也被修改。
再回顧下《文件系統研究之一》中提到的i節點結構。i節點結構中有一個很重要的字段就是鏈接數。所以刪除一個文件,不一定就會真的釋放其i節點,刪除文件其實是在目錄文件中,根據文件名找到對應的i節點,先把i節點鏈接數減一,再刪除目錄結構中文件記錄,當且僅當i節點接數為0時,才真的釋放對應的i節點。
總結一下硬鏈接與符號鏈接的區別:
1、硬鏈接是通過i節點來關聯文件;
不同的文件系統都有自己獨立的i節點,所以硬鏈接不能跨越文件系統,不能指向目錄;
2、符號鏈接是通過文件名來關聯文件;
即便是原文件刪除,符號鏈接依然可以存在,但是指向是空。只是可以獨立於原文件而存在,新建文件後可以自動指向新的文件。符號鏈接可以跨越文件系統,可以指向目錄。
3、硬鏈接用ln創建,符號鏈接用ln -s創建;
4、符號鏈接類似windows裡的快捷方式,硬鏈接有點類似共享;
5、lstat()可以獲取鏈接文件本身的信息,stat()函數獲取指向文件的信息。