1. 程式人生 > >Linux目錄與連結

Linux目錄與連結

目錄

    在檔案系統中,目錄與普通檔案主要有兩個區別。

  1. i節點條目中,會將目錄標記為一種不同的檔案型別。
  2. 目錄是一種特殊的檔案,本質上是一個表格,包含檔名和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);

    硬連結的限制有兩點,均可用符號連結取代:

  1. 硬連結必須與指代檔案在同一個檔案系統。因為只有在同一個檔案系統,才能保證指向相同的一個i節點。
  2. 不能為目錄建立硬連結。

軟連結(符號連結)

    符號連結是一個內容包含了另一個檔名稱的檔案,其不會加入檔案的連結計數中,因此可以連結不同檔案系統中的一個檔案。

    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》