stat() - Unix,Linux系統呼叫
廣告
名稱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_IFMT | 0170000 | 檔案型別位欄位的位掩碼 |
| S_IFSOCK | 0140000 | 套接字 |
| S_IFLNK | 0120000 | 符號連結 |
| S_IFREG | 0100000 | 普通檔案 |
| S_IFBLK | 0060000 | 塊裝置 |
| S_IFDIR | 0040000 | 目錄 |
| S_IFCHR | 0020000 | 字元裝置 |
| S_IFIFO | 0010000 | FIFO |
| S_ISUID | 0004000 | 設定 UID 位 |
| S_ISGID | 0002000 | 設定組 ID 位(見下文) |
| S_ISVTX | 0001000 | 粘滯位(見下文) |
| S_IRWXU | 00700 | 檔案所有者許可權掩碼 |
| S_IRUSR | 00400 | 所有者具有讀許可權 |
| S_IWUSR | 00200 | 所有者具有寫許可權 |
| S_IXUSR | 00100 | 所有者具有執行許可權 |
| S_IRWXG | 00070 | 組許可權掩碼 |
| S_IRGRP | 00040 | 組具有讀許可權 |
| S_IWGRP | 00020 | 組具有寫許可權 |
| S_IXGRP | 00010 | 組具有執行許可權 |
| S_IRWXO | 00007 | 其他人(不在組中)的許可權掩碼 |
| S_IROTH | 00004 | 其他人具有讀許可權 |
| S_IWOTH | 00002 | 其他人具有寫許可權 |
| S_IXOTH | 00001 | 其他人具有執行許可權 |
設定組 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_blocks和st_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 | 八進位制 | 描述 |
| f000 | S_IFMT | | 170000 | 檔案型別掩碼 |
| 0000 | | | 000000 | SCO 停用 inode,BSD 未知型別 |
| | | | | SVID-v2 和 XPG2 對於普通檔案都具有 0 和 0100000 |
| 1000 | S_IFIFO | p| | 010000 | FIFO(命名管道) |
| 2000 | S_IFCHR | c | 020000 | 字元特殊(V7) |
| 3000 | S_IFMPC | | 030000 | 多路複用字元特殊(V7) |
| 4000 | S_IFDIR | d/ | 040000 | 目錄(V7) |
| 5000 | S_IFNAM | | 050000 | XENIX 命名特殊檔案 |
| | | | | 具有兩種子型別,由 st_rdev 值 1、2 區分 |
| 0001 | S_INSEM | s | 000001 | XENIX IFNAM 的訊號量子型別 |
| 0002 | S_INSHD | m | 000002 | XENIX IFNAM 的共享資料子型別 |
| 6000 | S_IFBLK | b | 060000 | 塊特殊(V7) |
| 7000 | S_IFMPB | | 070000 | 多路複用塊特殊(V7) |
| 8000 | S_IFREG | - | 100000 | 普通(V7) |
| 9000 | S_IFCMP | | 110000 | VxFS 壓縮 |
| 9000 | S_IFNWK | n | 110000 | 網路特殊(HP-UX) |
| a000 | S_IFLNK | l@ | 120000 | 符號連結(BSD) |
| b000 | S_IFSHAD | | 130000 | Solaris 用於 ACL 的影子 inode(使用者空間看不到) |
| c000 | S_IFSOCK | s= | 140000 | 套接字(BSD;在 VxFS 上也稱為“S_IFSOC”) |
| d000 | S_IFDOOR | D> | 150000 | Solaris 門 |
| e000 | S_IFWHT | w% | 160000 | BSD 白洞(不用於 inode) |
| 0200 | S_ISVTX | | 001000 | “粘滯位”:即使使用後也要儲存交換文字(V7) |
| | | | | 保留(SVID-v2) |
| | | | | 在非目錄上:不要快取此檔案(SunOS) |
| | | | | 在目錄上:受限刪除標誌(SVID-v4.2) |
| 0400 | S_ISGID | | 002000 | 執行時設定組 ID(V7) |
| | | | | 對於目錄:使用 BSD 語義來傳播 GID |
| 0400 | S_ENFMT | | 002000 | SysV 檔案鎖定強制(與 S_ISGID 共享) |
| 0800 | S_ISUID | | 004000 | 執行時設定使用者 ID(V7) |
| 0800 | S_CDF | | 004000 | 目錄是上下文相關檔案(HP-UX) |
粘滯命令出現在 32V AT&T UNIX 版本中。 參見
廣告
|