我现在已经开始大约两个小时了,但我找不到任何有帮助的答案。
在联机帮助页中指定的'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)都缺失,因此struct包含一些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 );
如果你能帮忙解决这个问题,我真的很高兴,我真的不知道为什么我不能使用我的struct的st_ctime字段进行编译,而且通常gcc在谈话时没有太大的帮助关于错误; - )
可能它需要对#include问题做些什么,但我无法确定是什么。
答案 0 :(得分:2)
POSIX 2008要求stat()返回struct timespec,以便时间戳的小数部分可用于精确的时间戳精度 - 一秒的分辨率不足以用于文件时间。
增加:
来自man page
从内核2.5.48开始,stat结构支持三个文件时间戳字段的纳秒分辨率。如果定义了_BSD_SOURCE或_SVID_SOURCE特征测试宏,则Glibc使用st_atim.tv_nsec形式的名称公开每个字段的纳秒组件。这些字段在POSIX.1-2008中指定,并且从版本2.12开始,如果_POSIX_C_SOURCE定义为值200809L或更高,则glibc也会公开这些字段名称,或者_XOPEN_SOURCE定义为值700或更大。如果没有定义上述宏,则使用st_atimensec形式的名称公开纳秒值。在不支持亚秒时间戳的文件系统上,返回值为0的纳秒字段。
答案 1 :(得分:0)
我的文档(man lstat
)指定要在标题前定义和功能测试宏要求的标题
#define _POSIX_C_SOURCE 200112L
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
/* use stat, fstat, or lstat */