这章的讨论主要集中在这三个stat函数,以及它们返回的信息。
- #include <sys/stat.h>
- int stat(const char *restrict pathname, struct stat *restrict buf);
- int fstat(int filedes, struct stat *buf);
- int lstat(const char *restrict pathname, struct stat *restrict buf);
- 三个函数成功都返回0,错误都返回-1。
给定一个路径名,stat函数返回一个关于名字对应的文件的信息。fstat函数得到关于已经在描述符filedes上打开的文件的信息。lstat函数
与stat相似,但当文件是一个符号链接时,lstat函数返回关于符号链接的信息,而不是其所指向的文件。(我们在4.21节遍历目录结构时会用到
lstat。在4.16节会更深入讲述符号链接。)
第二个参数是一个指向一个我们必须提供的结构体的指针。函数填充buf指向的结构体。结构体的定义在不同实现间会有不同,但它看起来大概是:
- struct stat {
- mode_t st_mode; /* 文件类型和模式(权限) */
- ino_t st_ino; /* i-node号(序列化号) */
- dev_t st_dev; /* 设备号(文件系统) */
- dev_t st_rdev; /* 特殊文件的设备号 */
- nlink_t st_nlink; /* 链接的数量 */
- uid_t st_uid; /* 属主的用户ID */
- git_t st_gid; /* 属主的组ID */
- off_t st_size; /* 普通文件的以字节为单位的尺寸 */
- time_t st_atime; /* 最后访问时间 */
- time_t st_mtime; /* 最后修改时间 */
- time_t st_ctime; /* 最后文件状态改变时间 */
- blksize_t st_blksize; /* 最好的I/O块尺寸 */
- blkcnt_t st_blocks; /* 分配的磁盘块的数量 */
- };
st_rdev、st_blksize和st_blocks域并不是POSIX.1所要求的。它们定义在SUS的XSI扩展里。
注意每个成员都由原始系统数据类型指定。我们将会遍历这个结构体的每个成员来检查一个文件的属性。
stat函数的最大的用户很可能是ls -l命令,用来知道一个文件的所有信息。
阅读(484) | 评论(0) | 转发(0) |