为什么我的struct stat有一个st_mtim而不是st_mtime字段?

时间:2014-05-29 22:42:07

标签: c++ c linux unix

对于我的计算机科学课,我们正在实施" ls" C程序中的功能,需要使用st_mtime字段。但是,当我使用struct stat时,它只有一个st_mtim字段而不是我需要的st_mtime字段。这与我在/usr/include/sys/stat.h中的头文件中看到的相匹配。如何获得具有我需要的字段的结构定义?

2 个答案:

答案 0 :(得分:5)

我在我的系统(Debian)上看了一下。

出于某种原因,st_mtime被定义为宏;定义是st_mtim

忽略标题的内容(对于编译器而言,它们对人类读者来说意味着更多),并且只需按照文档进行操作即可。 man 2 stat会告诉您需要包含哪些标头,至少在我的系统上会显示一个示例程序。


血腥细节(你无需知道正确使用它):

/usr/include/bits/stat.h中,类型struct stat由以下成员(以及其他成员)定义:

struct timespec st_atim;        /* Time of last access.  */
struct timespec st_mtim;        /* Time of last modification.  */
struct timespec st_ctim;        /* Time of last status change.  */

struct timespec是一种结构,其中包含名为time_t的{​​{1}}类型的成员。 (其他成员允许更高分辨率的时间戳。)

接下来是以下预处理程序指令:

tv_sec

因此,您只需在自己的代码中引用# define st_atime st_atim.tv_sec # define st_mtime st_mtim.tv_sec # define st_ctime st_ctim.tv_sec ,它就会扩展为foo.st_mtime,这是您需要的foo.st_mtim.tv_sec对象。

更新

time_t等的声明在此评论之前(在我目前的Ubuntu 18.04系统上):

st_atim

答案 1 :(得分:0)

在我的Distro(Fedora)上,st_time被定义为一个宏,如下所示,修改时间包括使用struct timespec的修改时间的纳秒数

$ grep -R st_mtim  /usr/include
....
/usr/include/bits/stat.h:    struct timespec st_mtim /* Time of last modification.  */
/usr/include/bits/stat.h:# define st_mtime st_mtim.tv_sec
....

完成宏以便与man fstat中记录的st_time字段向后兼容 - 所以只需按照文档记录使用它,或者如果你想做得比秒更好,则使用完整的计时器分辨率。 ...