C统计结构没有st_ctime字段,但只有st_ctim

我现在已经google了大约两个小时,但我找不到任何帮助的答案。

在手册页中定义的“stat”定义为存在st_ctime字段。

struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device ID (if special file) */ off_t st_size; /* total size, in bytes */ blksize_t st_blksize; /* blocksize for file system I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ time_t st_atime; /* time of last access */ time_t st_mtime; /* time of last modification */ time_t st_ctime; /* time of last status change */ }; 

然而,这似乎并不是我的系统,即使我使用gcc(这应该是行为的标准)。

实际上,所有的时间字段(atime,mtime,ctime)都是缺失的,因此结构体包含一些atim,mtim和ctim值,它们会返回timespec而不是所需的time_t值。

现在我的问题:

  1. 这是为什么? 也许我包括错误的头,但我真的相信它必须是sys / stat.h。
  2. 我没有find太多关于timepec的信息,它是什么,为什么它返回这里?
  3. 即使我find了解决方法,它是否有助于其他系统无法执行我的代码吗?

我使用的是Ubuntu 11.10和gcc 4.6.1。

我的代码(部分):

 struct stat file_info; time_t t; if( lstat( path, &file_info ) == 0 ) { struct tm* timeinfo; t = file_info.st_ctime; timeinfo = localtime( &t ); 

我真的很高兴,如果你可以帮助这个,我真的不知道为什么我不能使用我的结构的st_ctime字段编译,像往常一样,gcc在谈论错误时没有太多的帮助; – )

可能它需要做一些#include的问题,但我不能确定是什么。

POSIX 2008要求stat()返回struct timespec,以便时间戳的小数部分可用于精确的时间戳精度 – 一秒钟的分辨率对于文件时间是不够的。

添加:

从手册页

自内核2.5.48以来,stat结构支持三个文件时间戳字段的纳秒分辨率。 如果定义了_BSD_SOURCE或_SVID_SOURCE特性测试宏,则Glibc会使用st_atim.tv_nsec形式的名称公开每个字段的纳秒组件。 这些字段在POSIX.1-2008中指定,从版本2.12开始,如果_POSIX_C_SOURCE定义为值200809L或更大,或者_XOPEN_SOURCE定义值为700或更大,那么glibc也公开这些字段名称。 如果没有定义前述的宏,那么纳秒值将暴露于st_atimensec形式的名称中。 在不支持亚秒时间戳的文件系统上,纳秒字段返回值为0。

我的文档( man lstat )指定了要包含的头文件要在头文件之前定义的功能测试宏要求

 #define _POSIX_C_SOURCE 200112L #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> /* use stat, fstat, or lstat */