C stat struct没有st_ctime字段,只有st_ctim

时间:2011-12-06 17:15:29

标签: c ubuntu system-calls stat

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

在联机帮助页中指定的'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值。

现在我的问题:

  1. 为什么会这样?也许我包含了错误的标题,但我确定它必须是sys / stat.h。
  2. 我没有找到太多关于timespec的信息,它是什么以及为什么它会在这里返回?
  3. 即使我找到了解决方法,它有助于m还是其他任何系统都无法执行我的代码?
  4. 我正在使用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问题做些什么,但我无法确定是什么。

2 个答案:

答案 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 */