stat () , stat64() -获取文件信息
标准
| 标准/扩展 | C 或 C++ | 依赖关系 |
|---|---|---|
POSIX.1
XPG4 XPG4.2 单一 UNIX 规范版本 3 |
两个 |
格式
统计信息:#define _POSIX_SOURCE
#include <sys/stat.h>
int stat(const char *__restrict__ pathname, struct stat *__restrict__ info);stat64:#define _LARGE_TIME_API
#define _POSIX_SOURCE
#include <sys/stat.h>
int stat64(const char *__restrict__ pathname, struct stat64 *__restrict__ info);编译需求: 使用 stat64() 函数需要 long long 数据类型。 有关如何使 long
long 数据类型可用的更多信息,请参阅 z/OS XL C/C++ Language Reference。
一般描述
获取有关指定文件 pathname 自变量
指向的
的状态信息,并将其放在 info 参数所指向的内存区域中。 该进程不需要对文件本身的许可权,但必须对 pathname的所有目录组件具有搜索许可权。 如果指定的文件是符号链接,那么 stat() 将解析符号链接。 它还会返回有关生成的文件的信息。
stat64() 函数的行为与 stat() 完全相似,但 stat64() 使用结构 stat64 而不是结构 stat 来支持时间超过 2038 年 1 月 19 日 UTC 时间 03:14:07。
将返回 stat 和 stat64 结构的下表中所显示的信息,如 sys/stat.h 头文件中所定义。
| 统计信息的值 | stat64 的值 | 描述 |
|---|---|---|
| mode_t st_mode | mode_t st_mode | 指示符号的许可权和特权的位字符串在 sys/stat.h 头文件中定义,以引用 mode_t 值中的位; 这些符号在 chmod ()-更改文件或目录的方式中列出。 |
| 索引 _ t st_ino | 索引 _ t st_ino | 文件的序列号。 |
| 设备测试设备 | 设备测试设备 | 包含文件的设备的数字标识。 |
| nlink_t st_nlink | nlink_t st_nlink | 指向文件的链接数。 |
| uid_t st_uid | uid_t st_uid | 文件所有者的数字用户标识 (UID)。 |
| gid_t st_gid | gid_t st_gid | 文件组的数字组标识 (GID)。 |
| off_t st_size | 长整型 st_size | 对于常规文件,该文件的大小 (以字节为单位)。 对于其他类型的文件,未指定此字段的值。 |
| time_t st_atime | time64_t st_atime | 最近一次访问文件的时间。 |
| time_t st_ctime | time64_t st_ctime | 最近一次更改文件状态的时间。 |
| time_t st_mtime | time64_t st_mtime | 最近一次更改文件内容的时间。 |
time_t_ 和 time64_t 的值以自戳记以来的秒数表示。
在将信息放入 stat 结构之前, stat() 会更新与时间相关的字段。
sys/modes.h 头文件中定义的宏集合来检查 st_mode 字段中 mode_t 值的属性。 如果 mode 是 mode_t 值,而 genvalue 是来自 stat 结构的 unsigned int 值,那么:- S_ISBLK (方式)
- 对于块特殊文件为非零。
- S_ISCHR (方式)
- 对于字符特殊文件为非零。
- S_ISDIR (方式)
- 对于目录为非零。
- S_ISEXTL (方式, genvalue)
- 对于外部链接为非零。
- S_ISFIFO (方式)
- 对于管道和 FIFO 特殊文件为非零。
- S_ISLNK (方式)
- 对于符号链接为非零。
- S_ISREG (方式)
- 对于常规文件为非零。
- S_ISSOCK (方式)
- 对于套接字非零。
如果 stat() 成功确定此信息,那么它会将其存储在 info 参数指示的区域中。 缓冲区的大小决定了存储的信息量; 超过缓冲区大小的数据将被截断。
针对 z/OS® UNIX 文件的大型文件支持: stat64() 自动支持针对 AMODE 31 和 AMODE 64 C/C++ 应用程序的大型 z/OS UNIX 文件,这意味着不需要定义 _LARGE_FILES 功能测试宏。 对于 stat(),对于 AMODE 64 C/C++ 应用程序,自动支持仅为 。 AMODE 31 C/C++ 应用程序必须使用 long long data type support enabled 进行编译,并在包含任何头之前定义 _LARGE_FILES 功能测试宏,以使 stat() 能够在大小大于 2 GB 的 z/OS UNIX 文件上运行。 文件大小和偏移量字段在宽度上扩大到 63 位。 因此,还需要对该文件运行的任何其他函数来定义 _LARGE_FILES 功能部件测试宏。
返回值
如果成功, stat() 将返回 0。
stat() 返回 -1 ,并将 errno 设置为以下值之一:- 错误代码
- 描述
- EACCES
- 该进程对 pathname 前缀的某些组件不具有搜索许可权。
- EINVAL
- info 是 NULL 指针。
- EIO
- 已针对 XPG4.2添加: 从文件系统读取时发生错误。
- ELOOP
- 在解析 pathname 参数期间迂到的符号链接中存在循环。 如果在解析 pathname 参数期间迂到多个 POSIX_SYMLOOP (在 limits.h 头文件中定义) 符号链接,那么将返回此错误。
- ENAMETOOLONG
- pathname 比 PATH_MAX 字符长,或者当 _POSIX_NO_TRUNC 生效时, pathname 的某些组件比 NAME_MAX 字符长。 对于符号链接,替换符号链接的路径名字符串的长度超过 PATH_MAX。 可以使用
pathconf()来确定 PATH_MAX 和 NAME_MAX 值。 - ENOENT
- 没有名为 pathname的文件,或者 pathname 是空字符串。
- ENOTDIR
- pathname 前缀的组件不是目录。
- 溢出
- 无法在信息所指向的结构中正确表示文件大小 (以字节为单位) 或分配给文件的块数或文件序列号。
stat() 函数在检测 z/OS UNIX 文件的 EOVERFLOW 条件方面的行为。 缺省情况下,如果无法在 buf指向的结构中正确表示文件大小,那么 stat() 函数将不会设置 EOVERFLOW。 当 _EDC_EOVERFLOW 设置为 YES 时, stat() 函数将检查溢出情况。示例
/* CELEBS33
This example gets status information about a file.
*/
#define _POSIX_SOURCE
#include <sys/types.h>
#include <sys/stat.h>
#undef _POSIX_SOURCE
#include <stdio.h>
#include <time.h>
main() {
struct stat info;
if (stat("/", &info) != 0)
perror("stat() error");
else {
puts("stat() returned the following information about root f/s:");
printf(" inode: %d\n", (int) info.st_ino);
printf(" dev id: %d\n", (int) info.st_dev);
printf(" mode: %08x\n", info.st_mode);
printf(" links: %d\n", info.st_nlink);
printf(" uid: %d\n", (int) info.st_uid);
printf(" gid: %d\n", (int) info.st_gid);
printf("created: %s", ctime(&info.st_createtime));
}
}
stat() 返回了有关根 f/s的以下信息:
inode: 0
dev id: 1
mode: 010001ed
links: 11
uid: 0
gid: 500
created: Fri Jun 16 10:07:55 2006相关信息
- sys/stat.h - z/OS UNIX 文件和访问
- sys/types.h -typedef 符号和结构
- chmod ()-更改文件或目录的方式
- chown ()-更改文件或目录的所有者或组
- creat ()-创建新文件或重写现有文件
- dup ()-复制打开的文件描述符
- fcntl ()-控制打开的文件描述符
- fstat () , fstat64()-获取有关文件的状态信息
- link ()-创建指向文件的链接
- lstat () , lstat64()-获取文件或符号链接的状态
- mkdir ()-创建目录
- mkfifo ()-创建 FIFO 特殊文件
- open ()-打开文件
- pipe ()-创建未命名的管道
- read ()-从文件或套接字读取
- readlink ()-读取符号链接的值
- remove ()-删除文件
- rexec ()-在远程主机上一次执行一个命令
- symlink ()-创建指向路径名的符号链接
- unlink ()-除去目录条目
- utime () , utime64()-设置文件访问和修改时间
- write ()-在文件或套接字上写入数据