1. 程式人生 > >APUE 檔案和目錄

APUE 檔案和目錄

檔案和目錄

Unix 所有的檔案都對應一個 struct stat,包含了一個檔案所有的資訊。

#include <sys/stat.h>

struct stat {
    mode_t          st_mode;    // 檔案型別和使用者訪問許可權
    ino_t           st_ino;     // inode 號
    dev_t           st_dev;     // 檔案系統裝置號
    dev_t           st_rdev;    // 特殊檔案裝置號
    nlink_t         st_nlink;   // 連結(引用)計數,這個指對inode的連結數
    uid_t           st_uid;     // 檔案所有者 ID
    uff_t           st_gid;     // 檔案組所有者 ID
    off_t           st_size;    // 普通檔案的位元組數
    struct timespec     st_atime;   // 檔案最後訪問的時間
    struct timespec     st_mtime;   // 檔案最後修改的時間
    struct timespec     st_ctime;   // 檔案最後狀態改變的時間,對inode操作
    blksize_t       st_blksize; // 最佳I/O塊大小
    blkcnt_t        st_blocks;  // 磁碟分配的塊數
};

檔案型別

  • 普通檔案
  • 目錄檔案
  • 塊特殊檔案
  • 字元特殊檔案
  • FIFO
  • 套接字
  • 符號連結

可以用 巨集 S_ISXXX(mode) 來判斷具體的檔案型別,或者用 st_mode 與遮蔽字 S_IFMT 進行邏輯“與”運算,巨集定義為:
#define S_ISXXX(mode) ((mode) & S_IFMT)) == S_IFXXX

檔案訪問許可權
檔案訪問許可權(使用者)是由 S_IXXXX 等來控制的,這裡稍微理一下。O_RDWR 這些標誌是檔案開啟讀寫執行時用的,字首為O(open),這裡S(stat)開頭的巨集是關於檔案的型別和使用者檔案訪問許可權的。
S_IRUSR、S_IWUSR、S_IXUSR

分別為使用者(所有者)讀、寫、執行,當三個都滿足時可以直接寫 S_IRWXU,其他型別使用者類似。

聯絡遮蔽字umask,有三個八進位制位,分別代表所有者,組,其他使用者。

  • 400 使用者讀
  • 200 使用者寫
  • 100 使用者執行

其他使用者型別類似。在檔案模式中建立遮蔽字為 1 的位,檔案中mode中的相關位將被關閉。

連結

  • 硬連結
  • 符號連結

每個inode中都有一個連結計數,其值是指向該inode的檔案目錄項數,同時也包含在結構stat中的st_nlink裡。只有當目錄項數減為 0 時,才可刪除該資料塊。這種連結稱為硬連結。
符號連結可以理解為是檔案資料塊的一個指標,刪除了檔案,符號連結也就失效了。

再看個目錄項的連結計數: 一個也目錄下的連結計數最後少為2,一個來自命名改目錄的目錄項,一個是在目錄中的.項。

結語
感覺這章的重點就在這些地方了,檔案系統這一塊我只說了大概,下一篇深入理解下linux的檔案系統