我现在已经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值。
现在我的问题:
我使用的是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 */