Linux下開發 揭秘檔案鏈結數

2021-08-10 07:42:36 字數 2937 閱讀 9366

每乙個檔案,都可以通過乙個struct stat的結構體來獲得檔案資訊,其中乙個成員st_nlink代表檔案的鏈結數。

struct stat ;
當通過shell的touch命令或者在程式中open乙個帶有o_creat的不存在的檔案時,檔案的鏈結數為1。

通常open乙個已存在的檔案不會影響檔案的鏈結數。open的作用只是使呼叫程序與檔案之間建立一種訪問關係,即open之後返回fd,呼叫程序可以通過fd來read、write 、 ftruncate等等一系列對檔案的操作。

close()就是消除這種呼叫程序與檔案之間的訪問關係。自然,不會影響檔案的鏈結數。在呼叫close時,核心會檢查開啟該檔案的程序數,如果此數為0,進一步檢查檔案的鏈結數,如果這個數也為0,那麼就刪除檔案內容

link

函式建立乙個新目錄項,並且增加乙個鏈結數。

int unlink( constchar* pathname);

此函式刪除目錄項,並將由pathname所引用檔案的鏈結計數減1。如果還有指向該檔案的其它鏈結,則仍可通過其他鏈結訪問該檔案的資料。如果出錯,則不對該檔案做任何更改。

只有當鏈結計數達到0時,該檔案的內容才可被刪除。

關閉乙個檔案時,核心首先檢查開啟該檔案的程序數。如果該數達到0,然後核心檢查其鏈結數,如果這個數也是0,那麼就刪除該檔案的內容。

int main(void) ; 

if ((fd =open("tempfile", o_rdwr)) < 0) 

err_sys("open error"); 

if (unlink("tempfile") < 0) 

err_sys("unlink error"); 

printf("file unlinked/n"); 

read(fd, buf, sizeof(buf));//you could still read this after unlink 

printf("%s/n", buf); 

}

如果pahtname是符號鏈結,那麼unlink刪除該符號鏈結,而不會刪除由該鏈結所引用的檔案。

int remove(constchar* pathname);

我們也可以用remove函式解除對乙個檔案或目錄的鏈結。對於檔案,remove

的功能與unlink相同。

iso c指定remove函式刪除乙個檔案,這更改了unix系統歷來使用的名字unlink,其原因是實現c標準的大多數非unix系統並不支援檔案鏈結。

綜上所訴,真正影響鏈結數的操作是link、unlink以及open的建立。刪除檔案內容的真正含義是檔案的鏈結數為0,而這個操作的本質完成者是unlink。close能夠實施刪除檔案內容的操作,必定是因為在close之前有乙個unlink操作。

舉個例子簡單說明:通過shell命令touch乙個檔案test.txt

1、stat("test.txt",&buf);

printf("1.link=%d\n",buf.st_nlink);//未開啟檔案之前測試鏈結數

2、fd=open("test.txt",o_rdonly);//開啟已存在檔案test.txt

stat("test.txt",&buf);

printf("2.link=%d\n",buf.st_nlink);//測試鏈結數

3、close(fd);//關閉檔案test.txt

stat("test.txt",&buf);

printf("3.link=%d\n",buf.st_nlink);//測試鏈結數

4、link("test.txt","test2.txt");//建立硬鏈結test2.txt

stat("test.txt",&buf);

printf("4.link=%d\n",buf.st_nlink);//測試鏈結數

5、unlink("test2.txt");//刪除test2.txt

stat("test.txt",&buf);

printf("5.link=%d\n",buf.st_nlink);//測試鏈結數

6、重複步驟2  //重新開啟test.txt

7、unlink("test.txt");//刪除test.txt

fstat(fd,&buf);

printf("7.link=%d\n",buf.st_nlink);//測試鏈結數

8、close(fd);//此步驟可以不顯示寫出,因為程序結束時,開啟的檔案自動被關閉。

順次執行以上8個步驟,結果如下:

1.link=1

2.link=1   //open不影響鏈結數

3.link=1   //close不影響鏈結數

4.link=2   //link之後鏈結數加1

5.link=1   //unlink後鏈結數減1

2.link=1   //重新開啟  鏈結數不變

7.link=0   //unlink之後再減1,此處我們改用fstat函式而非stat,因為unlilnk已經刪除檔名,所以不可以通過 檔名訪問,但是fd仍然是開啟著的,檔案內容還沒有被真正刪除,依舊可以使用fd獲得檔案資訊

執行步驟8,檔案內容被刪除

linux下的檔案鏈結

檔案鏈結,ln s sourcefile targetfile 加上 s為符號鏈結 符號鏈結下,targetfile相當於快捷方式檔案,sourcefile為原始檔 用ls l來檢視,會看到 targetfile sourcefile 符號鏈結類似於win下的快捷方式 鏈結有兩種,一種被稱為硬鏈結 ...

Linux下的鏈結檔案

linux下有多少種型別的檔案?了解一下 共7中 普通檔案 目錄檔案 d 裝置檔案 字元裝置 c 塊裝置 b 套接字檔案 s 例如socket套接字 鏈結檔案 l 硬鏈結,軟鏈結 管道檔案 p 簡單了解下linux檔案系統 每個檔案都有乙個inode 在linux中,我們查檔案時候,其實是通過ino...

關於 Linux 下的檔案硬鏈結,檔案軟鏈結

原作 cnmm22 這是乙個linux 跟windows 的區別,以後有空我會介紹一些這方面的區別 在linux 有個鏈結的功能 命令是 ln,可以 讓兩個檔案或目錄 目錄只能是軟連線 產生關聯,或產生乙個關聯檔案或目錄。所謂硬鏈結 比如 ln a.php b 把 a.php 鏈結到 b 可以理解為...