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)
    對於目錄:使用 BSD 語義來傳播 GID
0400S_ENFMT 002000SysV 檔案鎖定強制(與 S_ISGID 共享)
0800S_ISUID 004000執行時設定使用者 ID(V7)
0800S_CDF 004000目錄是上下文相關檔案(HP-UX)

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

參見



previous next Printer Friendly

廣告


  

廣告



廣告
© . All rights reserved.