对于我的计算机科学课,我们正在实施" ls" C程序中的功能,需要使用st_mtime字段。但是,当我使用struct stat时,它只有一个st_mtim字段而不是我需要的st_mtime字段。这与我在/usr/include/sys/stat.h中的头文件中看到的相匹配。如何获得具有我需要的字段的结构定义?
答案 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字段向后兼容 - 所以只需按照文档记录使用它,或者如果你想做得比秒更好,则使用完整的计时器分辨率。 ...