For the complete documentation index, see llms.txt. This page is also available as Markdown.

stat(2)

stat — 获取文件状态

名称

stat, lstat, fstat, fstatat

库

Lb libc

概要

#include <sys/stat.h>

int
stat(const char * restrict path, struct stat * restrict sb);

int
lstat(const char * restrict path, struct stat * restrict sb);

int
fstat(int fd, struct stat *sb);

int
fstatat(int fd, const char *path, struct stat *sb, int flag);

描述

stat() 系统调用获取由 path 所指向文件的信息。不要求对指定文件的读、写或执行权限,但通向该文件的路径名中列出的所有目录都必须可搜索。

lstat() 系统调用类似于 stat(),但当指定文件是符号链接时,lstat() 返回关于该链接的信息,而 stat() 返回该链接所引用文件的信息。

fstat() 系统调用获取由文件描述符 fd 所标识的已打开文件的相同信息。

fstatat() 系统调用等效于 stat() 和 lstat(),但当 path 指定相对路径时除外。对于 fstatat() 和相对 path,状态从相对于与文件描述符 fd 关联的目录的文件中获取,而不是相对于当前工作目录。

flag 的值由以下列表中定义的标志按位或运算构成,定义于

#include <fcntl.h>

AT_SYMLINK_NOFOLLOW 如果 path 命名一个符号链接,则返回该符号链接的状态。

AT_RESOLVE_BENEATH 仅遍历起始目录之下的路径。参见 open(2) 手册页中对 O_RESOLVE_BENEATH 标志的描述。

AT_EMPTY_PATH 如果 path 参数为空字符串,则对描述符 fd 所引用的文件或目录进行操作。如果 fd 等于 AT_FDCWD,则对当前工作目录进行操作。

如果 fstatat() 在 fd 参数中传入特殊值 AT_FDCWD,则使用当前工作目录,其行为分别与调用 stat() 或 lstat() 相同,具体取决于 flag 参数中是否设置了 AT_SYMLINK_NOFOLLOW 位。

当 fstatat() 以绝对 path 调用时,它忽略 fd 参数。

sb 参数是一个指向 stat 结构的指针,该结构由

#include <sys/stat.h>

定义,有关文件的信息将填入其中。

struct stat 中与文件系统相关的字段有:

st_dev 包含该文件的设备的数字 ID。

st_ino 文件的 inode 编号。

st_nlink 指向该文件的硬链接数。

st_flags 为该文件启用的标志。标志列表及其描述请参见 chflags(2)。

st_rdev 如果文件是字符或块特殊文件,则为该文件所引用设备的数字 ID;否则未指定。

st_dev 和 st_ino 字段一起在系统内唯一标识该文件。

struct stat 中与时间相关的字段有:

st_atim 文件数据最后一次被访问的时间。由 read(2) 和 readv(2) 等系统调用隐式更改,由 utimes(2) 显式更改。

st_mtim 文件数据最后一次被修改的时间。由 truncate(2)、write(2) 和 writev(2) 等系统调用隐式更改,由 utimes(2) 显式更改。此外,任何修改目录内容的系统调用都会更改受影响目录的 st_mtim。例如,creat(2)、mkdir(2)、rename(2)、link(2) 和 unlink(2)。

st_ctim 文件状态最后一次被更改(inode 数据修改)的时间。由任何影响文件元数据(包括 st_mtim)的系统调用隐式更改,例如 chflags(2)、chmod(2)、chown(2)、truncate(2)、utimes(2) 和 write(2)。此外,任何修改目录内容的系统调用都会更改受影响目录的 st_ctim。例如,creat(2)、mkdir(2)、rename(2)、link(2) 和 unlink(2)。

st_birthtim inode 创建时间。

为兼容性定义了以下与时间相关的宏:

struct stat 中与大小相关的字段有:

st_size 文件大小(以字节为单位)。

st_blksize 该文件的最佳 I/O 块大小。

st_blocks 为该文件分配的实际块数(以 512 字节为单位)。由于短符号链接存储在 inode 中,此数字可能为零。

struct stat 中与访问相关的字段有:

st_uid 文件所有者的用户 ID。

st_gid 文件的组 ID。

st_mode 文件的状态(见下文)。

状态信息字 st_mode 具有以下位:

访问模式列表,请参见

#include <sys/stat.h>

access(2) 和 chmod(2)。以下宏可用于测试 m 参数中传入的 st_mode 值是否对应于指定类型的文件:

S_ISBLK(m) 测试是否为块特殊文件。

S_ISCHR(m) 测试是否为字符特殊文件。

S_ISDIR(m) 测试是否为目录。

S_ISFIFO(m) 测试是否为管道或 FIFO 特殊文件。

S_ISLNK(m) 测试是否为符号链接。

S_ISREG(m) 测试是否为普通文件。

S_ISSOCK(m) 测试是否为套接字。

S_ISWHT(m) 测试是否为 whiteout。

如果测试为真,这些宏求值为非零值;如果测试为假,则求值为 0。

返回值

成功完成时返回值 0;否则返回值 -1,并设置全局变量 errno 以指示错误。

兼容性

系统的早期版本对 st_dev、st_uid、st_gid、st_rdev、st_size、st_blksize 和 st_blocks 字段使用不同的类型。

错误

stat() 和 lstat() 系统调用在以下情况下会失败:

[EACCES] 路径前缀的某个组件的搜索权限被拒绝。

[EFAULT] sb 或 path 参数指向无效地址。

[EIO] 在向文件系统读取或写入时发生 I/O 错误。

[EINTEGRITY] 从文件系统读取时检测到数据损坏。

[ELOOP] 在转换路径名时遇到过多的符号链接。

[ENAMETOOLONG] 路径名的某个组件超过 255 个字符,或整个路径名超过 1023 个字符。

[ENOENT] 指定的文件不存在。

[ENOTDIR] 路径前缀的某个组件不是目录。

[EOVERFLOW] 以字节为单位的文件大小无法在 sb 所指向的结构中正确表示。

fstat() 系统调用在以下情况下会失败:

[EBADF] fd 参数不是有效的打开文件描述符。

[EFAULT] sb 参数指向无效地址。

[EIO] 在向文件系统读取或写入时发生 I/O 错误。

[EINTEGRITY] 从文件系统读取时检测到数据损坏。

[EOVERFLOW] 以字节为单位的文件大小无法在 sb 所指向的结构中正确表示。

除 lstat() 返回的错误外,fstatat() 还可能在以下情况下失败:

[EBADF] path 参数未指定绝对路径,且 fd 参数既不是 AT_FDCWD 也不是一个有效的可用于搜索的文件描述符。

[EINVAL] flag 参数的值无效。

[ENOTDIR] path 参数不是绝对路径,且 fd 既不是 AT_FDCWD 也不是与目录关联的文件描述符。

[ENOTCAPABLE] path 是绝对路径,或包含导致超出 fd 所指定目录层级的“..”组件,且进程处于 capability mode 或指定了 AT_RESOLVE_BENEATH 标志。

参见

access(2), chmod(2), chown(2), fhstat(2), statfs(2), utimes(2), sticky(7), symlink(7)

标准

stat() 和 fstat() 系统调用预期符合 IEEE Std 1003.1-1990 ("POSIX.1")。fstatat() 系统调用遵循 The Open Group Extended API Set 2 规范。

历史

stat() 和 fstat() 系统调用出现于 Version 1 AT&T UNIX。lstat() 系统调用出现于 4.2BSD。fstatat() 系统调用出现于 FreeBSD 8.0。

缺陷

对套接字应用 fstat() 返回一个清零的缓冲区,但 blocksize 字段以及唯一的设备和 inode 编号除外。

最后更新于

这有帮助吗?