stat() - Unix,Linux 系統呼叫 - 技術教學
Tutorials Point


  Unix 初學者指南
  Unix Shell 程式設計
  高階 Unix
  Unix 有用參考
  Unix 有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於 TP  

stat() - Unix,Linux 系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

stat、fstat、lstat - 獲取檔案狀態

語法

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *path, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *path, struct stat *buf);

描述

這些函式返回有關檔案的資訊。不需要對檔案本身具有任何許可權,但在 stat() 和 lstat() 的情況下,需要對通往檔案的 path 中的所有目錄具有執行(搜尋)許可權。

stat() 獲取 path 指向的檔案的狀態並填充 buf

lstat() 與 stat() 相同,但如果 path 是符號連結,則會獲取連結本身的狀態,而不是它所指向的檔案的狀態。

fstat() 與 stat() 相同,但要獲取狀態的檔案由檔案描述符 filedes 指定。

所有這些系統呼叫都返回一個 stat 結構,其中包含以下欄位

struct stat {
    dev_t     st_dev;     /* ID of device containing file */
    ino_t     st_ino;     /* inode number */
    mode_t    st_mode;    /* protection */
    nlink_t   st_nlink;   /* number of hard links */
    uid_t     st_uid;     /* user ID of owner */
    gid_t     st_gid;     /* group ID of owner */
    dev_t     st_rdev;    /* device ID (if special file) */
    off_t     st_size;    /* total size, in bytes */
    blksize_t st_blksize; /* blocksize for filesystem I/O */
    blkcnt_t  st_blocks;  /* number of blocks allocated */
    time_t    st_atime;   /* time of last access */
    time_t    st_mtime;   /* time of last modification */
    time_t    st_ctime;   /* time of last status change */
};

st_dev 欄位描述了此檔案所在的裝置。

st_rdev 欄位描述了此檔案(inode)表示的裝置。

st_size 欄位以位元組為單位給出檔案(如果它是常規檔案或符號連結)的大小。符號連結的大小是它包含的路徑名的長度,不包括尾隨的空位元組。

st_blocks 欄位指示分配給檔案的資料塊數,以 512 位元組為單位。(這可能小於 st_size/512,例如,當檔案有空洞時。)

st_blksize 欄位給出檔案系統 I/O 的“首選”塊大小。(以較小的塊寫入檔案可能會導致效率低下的讀-修改-重寫。)

並非所有 Linux 檔案系統都實現了所有時間欄位。某些檔案系統型別允許以這樣一種方式掛載,即檔案訪問不會導致更新 st_atime 欄位。(請參閱 mount(8) 中的“noatime”。)

st_atime 欄位會因檔案訪問而更改,例如,由 execve(2)、mknod(2)、pipe(2)、utime(2) 和 read(2)(超過零個位元組)更改。其他例程,如 mmap(2),可能會也可能不會更新 st_atime

st_mtime 欄位會因檔案修改而更改,例如,由 mknod(2)、truncate(2)、utime(2) 和 write(2)(超過零個位元組)更改。此外,目錄的 st_mtime 欄位會因該目錄中檔案的建立或刪除而更改。st_mtime 欄位不會因所有者、組、硬連結計數或模式的更改而更改。

st_ctime 欄位會因寫入或設定 inode 資訊(即所有者、組、連結計數、模式等)而更改。

以下 POSIX 宏定義用於使用 st_mode 欄位檢查檔案型別

標籤描述
S_ISREG(m)它是否為普通檔案?
S_ISDIR(m)目錄?
S_ISCHR(m)字元裝置?
S_ISBLK(m)塊裝置?
S_ISFIFO(m)FIFO(命名管道)?
S_ISLNK(m)符號連結?(不在 POSIX.1-1996 中。)
S_ISSOCK(m)套接字?(不在 POSIX.1-1996 中。)

以下標誌定義用於 st_mode 欄位

S_IFMT0170000檔案型別位欄位的位掩碼
S_IFSOCK0140000套接字
S_IFLNK0120000符號連結
S_IFREG0100000常規檔案
S_IFBLK0060000塊裝置
S_IFDIR0040000目錄
S_IFCHR0020000字元裝置
S_IFIFO0010000FIFO
S_ISUID0004000設定 UID 位
S_ISGID0002000設定組 ID 位(見下文)
S_ISVTX0001000粘滯位(見下文)
S_IRWXU00700檔案所有者許可權掩碼
S_IRUSR00400所有者具有讀取許可權
S_IWUSR00200所有者具有寫入許可權
S_IXUSR00100所有者具有執行許可權
S_IRWXG00070組許可權掩碼
S_IRGRP00040組具有讀取許可權
S_IWGRP00020組具有寫入許可權
S_IXGRP00010組具有執行許可權
S_IRWXO00007其他使用者(不在組中)的許可權掩碼
S_IROTH00004其他使用者具有讀取許可權
S_IWOTH00002其他使用者具有寫入許可權
S_IXOTH00001其他使用者具有執行許可權

設定組 ID 位 (S_ISGID) 有幾種特殊用途。對於目錄,它表示要對該目錄使用 BSD 語義:在那裡建立的檔案從目錄繼承其組 ID,而不是從建立程序的有效組 ID 繼承,並且在那裡建立的目錄也將設定 S_ISGID 位。對於未設定組執行位 (S_IXGRP) 的檔案,設定組 ID 位表示強制檔案/記錄鎖定。

目錄上的“粘滯”位 (S_ISVTX) 意味著只有檔案的所有者、目錄的所有者和特權程序才能重新命名或刪除該目錄中的檔案。

Linux 說明

從核心 2.5.48 開始,stat 結構支援三個檔案時間戳欄位的納秒解析度。如果定義了 _BSD_SOURCE 或 _SVID_SOURCE 特性測試宏,則 Glibc 使用 st_atim.tv_nsec 形式的名稱公開每個欄位的納秒分量;如果未定義這些宏,則使用 st_atimensec 形式的名稱公開。在不支援亞秒級時間戳的檔案系統上,這些納秒欄位將返回值為 0。

對於 /proc 目錄下的大多數檔案,stat() 不會在 st_size 欄位中返回檔案大小;而是返回值為 0 的欄位。

返回值

成功時,返回零。錯誤時,返回 -1,並且 errno 被相應地設定。

錯誤

標籤描述
EACCES path 的路徑字首中的一個目錄的搜尋許可權被拒絕。(另請參閱 path_resolution(2)。)
EBADF filedes 無效。
EFAULT 錯誤地址。
ELOOP 在遍歷路徑時遇到太多符號連結。
ENAMETOOLONG
 檔名太長。
ENOENT path 的一個元件不存在,或者路徑為空字串。
ENOMEM 記憶體不足(即核心記憶體)。
ENOTDIR
 路徑的一個元件不是目錄。

符合標準

這些系統呼叫符合 SVr4、4.3BSD、POSIX.1-2001。

st_blocksst_blksize 欄位的使用可能不太可移植。(它們是在 BSD 中引入的。解釋因系統而異,並且可能在單個系統上使用 NFS 掛載時存在差異。)

POSIX 沒有描述 S_IFMT、S_IFSOCK、S_IFLNK、S_IFREG、S_IFBLK、S_IFDIR、S_IFCHR、S_IFIFO、S_ISVTX 位,而是要求使用宏 S_ISDIR() 等。S_ISLNK 和 S_ISSOCK 宏不在 POSIX.1-1996 中,但兩者都存在於 POSIX.1-2001 中;前者來自 SVID 4,後者來自 SUSv2。

Unix V7(以及後來的系統)有 S_IREAD、S_IWRITE、S_IEXEC,而 POSIX 規定了同義詞 S_IRUSR、S_IWUSR、S_IXUSR。

其他系統

在各種系統上使用過(或正在使用)的值

十六進位制名稱ls八進位制描述
f000S_IFMT 170000檔案型別掩碼
0000  000000SCO 停用 inode,BSD 未知型別
    SVID-v2 和 XPG2 對於普通檔案都有 0 和 0100000
1000S_IFIFOp|010000FIFO(命名管道)
2000S_IFCHRc020000字元特殊(V7)
3000S_IFMPC 030000多路複用字元特殊(V7)
4000S_IFDIRd/040000目錄(V7)
5000S_IFNAM 050000XENIX 命名特殊檔案
    有兩個子型別,由 st_rdev 值 1、2 區分
0001S_INSEMs000001XENIX IFNAM 的訊號量子型別
0002S_INSHDm000002XENIX IFNAM 的共享資料子型別
6000S_IFBLKb060000塊特殊(V7)
7000S_IFMPB 070000多路複用塊特殊(V7)
8000S_IFREG-100000常規(V7)
9000S_IFCMP 110000VxFS 壓縮
9000S_IFNWKn110000網路特殊(HP-UX)
a000S_IFLNKl@120000符號連結(BSD)
b000S_IFSHAD 130000Solaris ACL 的影子 inode(使用者空間看不到)
c000S_IFSOCKs=140000套接字(BSD;VxFS 上也稱為“S_IFSOC”)
d000S_IFDOORD>150000Solaris 門
e000S_IFWHTw%160000BSD 清除(不用於 inode)
0200S_ISVTX 001000“粘滯位”:即使在使用後也儲存交換文字(V7)
    保留(SVID-v2)
    在非目錄上:不要快取此檔案(SunOS)
    在目錄上:受限刪除標誌(SVID-v4.2)
0400S_ISGID 002000執行時設定組 ID(V7)
    對於目錄:對 GID 的傳播使用 BSD 語義
0400S_ENFMT 002000SysV 檔案鎖定執行(與 S_ISGID 共享)
0800S_ISUID 004000執行時設定使用者 ID(V7)
0800S_CDF 004000目錄是上下文相關檔案(HP-UX)

粘滯命令出現在版本 32V AT&T UNIX 中。

另請參閱



previous next Printer Friendly

廣告


  

廣告



廣告