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) |
| | | | 對於目錄:對 GID 的傳播使用 BSD 語義 |
0400 | S_ENFMT | | 002000 | SysV 檔案鎖定執行(與 S_ISGID 共享) |
0800 | S_ISUID | | 004000 | 執行時設定使用者 ID(V7) |
0800 | S_CDF | | 004000 | 目錄是上下文相關檔案(HP-UX) |
粘滯命令出現在版本 32V AT&T UNIX 中。 另請參閱
廣告
|