stat函數(shù)可以返回一個(gè)結(jié)構(gòu),里面包括文件的全部屬性
#include<sys/stat.h>
int stat(const char *restrict pathname,struct stat *restrict buf);
int fstat(int fields,struct stat *buf);
int lstat(const char *restrict pathname,struct stat *restrict buf);
返回值:若成功則返回0,失敗則返回-1
struct stat {
dev_t st_dev; // 文件所在設(shè)備ID
ino_t st_ino; // 結(jié)點(diǎn)(inode)編號(hào)
mode_t st_mode; // 保護(hù)模式
nlink_t st_nlink; // 硬鏈接個(gè)數(shù)
uid_t st_uid; // 所有者用戶ID
gid_t st_gid; // 所有者組ID
dev_t st_rdev; // 設(shè)備ID(如果是特殊文件)
off_t ** st_size;** // 總體尺寸,以字節(jié)為單位
blksize_t st_blksize; // 文件系統(tǒng) I/O 塊大小
blkcnt_t st_blocks; // 已分配 512B 塊個(gè)數(shù)
time_t st_atime; // 上次訪問時(shí)間
time_t st_mtime; // 上次更新時(shí)間
time_t st_ctime; // 上次狀態(tài)更改時(shí)間
};
- st_dev字段描述該文件所在的設(shè)備。(major() 和minor()宏可能在分析這個(gè)設(shè)備ID域時(shí)有用。)
- st_rdev 字段描述這個(gè)文件(inode)本身代表的設(shè)備。
- st_size字段 給出文件字節(jié)尺寸(**如果它是一個(gè)普通文件或符號(hào)鏈接)。對(duì)于符號(hào)鏈接而言是它所有包含路徑名長度,不包括結(jié)尾的空字符。
- st_blocks 字段指明文件已經(jīng)分配數(shù)據(jù)塊的個(gè)數(shù),數(shù)據(jù)塊以 512 字節(jié)為單位。(這可能小于st_size/512,當(dāng)文件有空洞時(shí)。)
-
st_blksize 給出對(duì)于高效文件系統(tǒng) I/O 操作的優(yōu)先塊尺寸。(數(shù)據(jù)以小尺寸塊寫入文件時(shí)可能導(dǎo)致低效的讀-更改-覆蓋 操作。)
不是所有的 Linux 文件系統(tǒng)實(shí)現(xiàn)了所有的時(shí)間域。 - st_atime字段在文件訪問時(shí)更改,比如,execve()、mknod()、pipe()、utime() 和read()(多于零個(gè)字節(jié))。一些文件系統(tǒng)允許掛載時(shí)不去訪問文件或目錄且不會(huì)導(dǎo)致 st_atime 字段更新。(參考 mount() 的noatime、nodiratime 和 relatime,以及mount() 中相關(guān)的信息。)此外,如果文件以O(shè)_NOATIME 標(biāo)志打開,st_atime 不會(huì)被更新。
- st_mtime在文件更改時(shí)更新,比如,mknod()、truncate()、utime() 和write()(多于零個(gè)字節(jié))。再者,一個(gè)目錄的st_mtime在這個(gè)目錄里創(chuàng)建或刪除文件時(shí)更新。st_mtime 在更改所有者、組、硬鏈接個(gè)數(shù)或權(quán)限模式時(shí) 不會(huì)更新。
- st_ctime 字段在寫入或設(shè)置結(jié)點(diǎn)(inode)信息(如所有者、組、鏈接數(shù)、權(quán)限等等)時(shí)會(huì)更改。