Linux中link,unlink,close,fclose詳解
每一個檔案,都可以通過一個struct stat的結構體來獲得檔案資訊,其中一個成員st_nlink代表檔案的連結數。 當通過shell的touch命令或者在程式中open一個帶有O_CREAT的不存在的檔案時,檔案的連結數為1。 通常open一個已存在的檔案不會影響檔案的連結數。open的作用只是使呼叫程序與檔案之間建立一種訪問關係,即open之後返回fd,呼叫程序可以通過fd來read 、write 、 ftruncate等等一系列對檔案的操作。 close()就是消除這種呼叫程序與檔案之間的訪問關係。自然,不會影響檔案的連結數。在呼叫close時,核心會檢查開啟該檔案的程序數,如果此數為0,進一步檢查檔案的連結數,如果這個數也為0,那麼就刪除檔案內容。 link函式建立一個新目錄項,並且增加一個連結數。 unlink函式刪除目錄項,並且減少一個連結數。如果連結數達到0並且沒有任何程序開啟該檔案,該檔案內容才被真正刪除。如果在unlilnk之前沒有close,那麼依舊可以訪問檔案內容。 綜上所訴,真正影響連結數的操作是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);