`stat` 是一个用于获取文件或目录状态信息的系统调用,广泛应用于类 Unix 系统(如 Linux)中。以下是关于它的详细说明:
一、基本功能
`stat` 系统调用用于检索文件或目录的元数据,包括:
权限与所有权:文件类型(普通文件、目录等)、权限掩码、所属用户(UID)及所属组(GID)
文件属性:大小、创建时间、修改时间、访问时间等
链接信息:硬链接数、设备号、inode 编号等
二、函数原型与参数
在 C 语言中,`stat` 的函数原型为:
```c
include
int stat(const char *path, struct stat *buf);
```
参数:
`path`:指定要查询的文件或目录的路径(如 `/etc/passwd`)
`buf`:指向 `struct stat` 结构体的指针,用于存储返回的文件状态信息
三、返回值
成功:返回 0
失败:返回 -1,并设置 `errno` 表示错误代码(如文件不存在、权限不足等)
四、与相关函数的区别
stat:
通过文件路径获取状态信息
fstat:
通过文件描述符(如 `open` 返回的 fd)获取状态信息
lstat:
与 `stat` 功能相同,但不会跟随符号链接,直接返回链接目标的状态信息
五、应用示例(C 语言)
```c
include include include int main() { struct stat fileInfo; const char *filePath = "example.txt"; if (stat(filePath, &fileInfo) == 0) { printf("文件名: %s\n", fileInfo.st_name); printf("权限: %o\n", fileInfo.st_mode); printf("大小: %ld 字节\n", fileInfo.st_size); printf("修改时间: %s\n", ctime(&fileInfo.st_mtime)); } else { perror("stat 失败"); } return 0; } ``` 六、在编程中的使用 在 C++ 中,`os.stat()` 是标准库函数,封装了系统调用 `stat`,使用方式更简洁: ```cpp include include include int main() { struct stat fileInfo; const char *filePath = "example.txt"; if (stat(filePath, &fileInfo) == 0) { std::cout << "文件名: " << fileInfo.st_name << std::endl; std::cout << "权限: " << std::oct << fileInfo.st_mode << std::endl; std::cout << "大小: " << fileInfo.st_size << " 字节" << std::endl; std::cout << "修改时间: " << ctime(&fileInfo.st_mtime); } else { std::cerr << "stat 失败: " << std::strerror(errno) << std::endl; } return 0; } ``` 七、历史与扩展 `stat` 是 POSIX 标准的一部分,几乎所有类 Unix 系统都提供该接口。其底层实现通过系统调用与内核交互,获取文件系统的元数据。