Linux目錄與連結
阿新 • • 發佈:2019-01-04
目錄
在檔案系統中,目錄與普通檔案主要有兩個區別。
- i節點條目中,會將目錄標記為一種不同的檔案型別。
- 目錄是一種特殊的檔案,本質上是一個表格,包含檔名和i節點編號。而檔案的i節點中儲存資訊列表不包含檔名。
關於目錄的系統呼叫有很多。
#include <sys/stat.h> #include <unistd.h> #include <dirent.h> int mkdir(const char *pathname,mode_t mode); //mode和open()呼叫指定許可權相似 int rmdir(const char *pathname);//刪除的目錄為空時,呼叫才會成功 DIR *opendir(const char *pathname);//開啟目錄,返回DIR型別結構指標 struct dirent *readdir(DIR *dirp);//從一個目錄流中讀取連續條目 int closedir(DIR *dirp);//關閉目錄流
硬連結
硬連結是可以在不同目錄下有多個檔名稱,均指向相同的i節點,也就是指向相同的檔案。因此每個檔案都會有一個i節點的連結計數。在刪除檔案時,將相應的i節點的連結計數減一,若連結計數因此降為0,才釋放檔名所指帶的i節點和資料塊。
ln abc def。為檔案abc建立一個硬連結def。利用系統呼叫link()和unlink()分別建立和移除硬連結。
#include <unistd.h> int link(const char *oldpath,const char *newpath); int unlink(const char *pathname);
硬連結的限制有兩點,均可用符號連結取代:
- 硬連結必須與指代檔案在同一個檔案系統。因為只有在同一個檔案系統,才能保證指向相同的一個i節點。
- 不能為目錄建立硬連結。
軟連結(符號連結)
符號連結是一個內容包含了另一個檔名稱的檔案,其不會加入檔案的連結計數中,因此可以連結不同檔案系統中的一個檔案。
ln -s abc def。為檔案abc建立一個符號連結def。利用系統呼叫symlink()和readlink()可以建立符號連結。
#include <unistd.h> int symlink(const char *filepath,const char *linkpath); int readlink(const char *pathname,char *buffer,size_t bufsiz);
參考 《TLPI》、《APUE》