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。

将返回 statstat64 结构的下表中所显示的信息,如 sys/stat.h 头文件中所定义。

表 1. 在 stat 和 stat64 结构中返回的值
统计信息的值 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 值的属性。 如果 modemode_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 前缀的组件不是目录。
溢出
无法在信息所指向的结构中正确表示文件大小 (以字节为单位) 或分配给文件的块数或文件序列号。
注: 环境变量 _EDC_EOVERFLOW 可用于控制 stat() 函数在检测 z/OS UNIX 文件的 EOVERFLOW 条件方面的行为。 缺省情况下,如果无法在 buf指向的结构中正确表示文件大小,那么 stat() 函数将不会设置 EOVERFLOW。 当 _EDC_EOVERFLOW 设置为 YES 时, stat() 函数将检查溢出情况。

示例

CELEBS33
/* 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));
  }
}

output
stat() 返回了有关根 f/s的以下信息:

  inode:   0
 dev id:   1
   mode:   010001ed
  links:   11
    uid:   0
    gid:   500
created:   Fri Jun 16 10:07:55 2006

相关信息