在我的 Linux 系统上,如果我显示当前日期“t1”,触摸文件“f”,然后显示该“f”的修改时间“t2”,我会期望 t1 < t2。
但这并不是我在系统上执行此操作时总是得到的结果:
date +'%Y-%m-%d %H:%M:%S.%N'; \
touch f; \
stat -c %y f
输出示例:
2017-09-18 21:47:48.855229801
2017-09-18 21:47:48.853831698 +0200
请注意,第二个时间戳 (stat) 在第一个时间戳 (date) 之前:855229801 > 853831698
我的文件系统是ext4,但我也尝试过使用tmpfs上的文件,效果相同。为什么会这样呢?
谢谢
有关设置的一些信息
% which date
/usr/bin/date
% which touch
/usr/bin/touch
% pacman -Qo /usr/bin/date /usr/bin/touch
/usr/bin/date is owned by coreutils 8.28-1
/usr/bin/touch is owned by coreutils 8.28-1
% uname -a
Linux machine 4.12.12-1-ARCH #1 SMP PREEMPT Sun Sep 10 09:41:14 CEST 2017 x86_64 GNU/Linux
% findmnt
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda1 ext4 rw,relatime,data=ordered
└─/tmp tmpfs tmpfs rw,nosuid,nodev
答案1
每https://stackoverflow.com/questions/14392975/timestamp-accuracy-on-ext4-sub-millsecond:
ext4 文件系统代码调用
current_fs_time()
当前缓存的内核时间,截断为文件系统超级块中指定的时间粒度,对于 ext4 为 1ns。Linux 内核中的当前时间被缓存,并且通常仅在定时器中断时更新。因此,如果您的计时器中断以 10 毫秒运行,则缓存时间只会每 10 毫秒更新一次。当更新确实发生时,结果时间的准确性将取决于硬件上可用的时钟源。