【问题标题】:C stat struct does not have st_ctime field but only st_ctimC stat 结构没有 st_ctime 字段,但只有 st_ctim
【发布时间】:2012-01-14 07:03:39
【问题描述】:

我现在已经用谷歌搜索了大约两个小时,但我找不到任何有用的答案。

手册页中指定的“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. 我没有找到太多关于 timespec 的信息,它是什么,为什么会返回这里?
  3. 即使我找到了解决方法,它对我有帮助还是任何其他系统无法执行我的代码?

我使用的是 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 问题有关,但我无法确定是什么。

【问题讨论】:

  • 我和你的一样用了一个 sn-p,可以在 Ubuntu 11.10 64 位和 GCC 4.6.1 上编译。你遇到了什么错误?
  • @Dan Fego 我得到一个字段无法解析错误
  • 嗯,您能否使用您使用的命令行发布整个编译输出?
  • 好吧,对不起...这有点令人毛骨悚然,但是当我称之为“手动”时,我的 gcc 实际上会编译所有内容(gcc lister.c misc.c -o lister,其中 lister.c 是我遇到问题的文件和 misc.c 是具有所有一般功能的文件)但是使用 eclipse 它不会工作。我现在正试图通过所有的 make 文件。非常感谢,这里似乎不是真正的 C 问题,而是我的 IDE 的问题。再次抱歉,我似乎没有真正注意那里。

标签: c ubuntu system-calls stat


【解决方案1】:

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 或更大,或者 _XOPEN_SOURCE 定义为 700 或更大,glibc 也会公开这些字段名称。如果上述宏均未定义,则纳秒值将以 st_atimensec 形式的名称公开。在不支持亚秒级时间戳的文件系统上,返回纳秒字段的值为 0。

【讨论】:

  • 但为什么文档(手册页)没有提及任何更改?感谢您的回答。确实帮助了我很多,即使我不理解无证更改。
  • 我的 glibc 包含文件显示在定义 __USE_MISC 时使用了这些字段,但也为 st_atime 等定义了宏。所以这些应该仍然有效
【解决方案2】:

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

#define _POSIX_C_SOURCE 200112L
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

/* use stat, fstat, or lstat */

【讨论】:

  • 这意味着,当我希望我的程序使用 old stat 结构时,我只需要将 _POSIX_C_SOURCE 定义为 200112L 即可获得所需的行为?谢谢!
  • 嗯;我不知道。我对POSIX specification for struct stat 的阅读一直延伸到st_atimest_ctimest_mtime 是出于兼容性原因的宏...
  • 嗯,刚试了下,还是编译不出来。但作为一点补偿,我现在收到一条警告,说我重新定义了 _POSIC_C_SOURCE 宏。感谢你们两位令人印象深刻的快速回答。我不希望明天之前能够解决问题;-)
猜你喜欢
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 2010-12-11
相关资源
最近更新 更多