下面的 C 程序首先使用 clock_gettime() 获取时间,然后创建一个文件并读出其修改时间。至少在我的系统上,文件 mtime 是比 clock_gettime() 的结果更旧的时间戳。我的问题是如何解释这一点,是否有一个标准(例如 POSIX)来指定两者都必须按顺序排列?
/* Compile as C11 */
#define _POSIX_C_SOURCE 200809L
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
struct timespec buf_start;
int r= clock_gettime(CLOCK_REALTIME, &buf_start);
if (r != 0) {
perror("clock_gettime");
exit(1);
}
FILE *file= fopen("A", "w");
if (file == NULL) {
perror("A");
exit(1);
}
r= fputs("aaa\n", file);
if (r == EOF) {
perror("A");
exit(1);
}
r= fclose(file);
if (r != 0) {
perror("A");
exit(1);
}
struct stat stat_file;
r= stat("A", &stat_file);
if (r != 0) {
perror("A");
exit(1);
}
r= printf("%ld.%9ld\n%ld.%9ld\n",
buf_start.tv_sec, buf_start.tv_nsec,
stat_file.st_mtim.tv_sec, stat_file.st_mtim.tv_nsec);
if (r < 0) {
perror("printf");
exit(1);
}
exit(0);
}
在我的系统(Ubuntu 14.04)上,使用 gcc 4.8.4 和 ext4 文件系统,输出为:
1463778756.834469527
1463778756.832709123
即程序的启动时间在文件修改时间后报告为2 ms。
编辑:使用 CLOCK_REALTIME_COARSE,两个生成的时间戳完全相等,精确到纳秒。
编辑:clock_getres(CLOCK_REALTIME, ...) 返回的分辨率是一纳秒。
编辑:添加了文件系统信息。