查看文件mtimes的奇怪时间排序,我注意到(gnu)touch
命令包含utimensat
系统调用作为其触摸序列的一部分:
open("touchedLater", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
dup2(3, 0) = 0
close(3) = 0
dup2(0, 0) = 0
utimensat(0, NULL, NULL, 0) = 0
close(0) = 0
看来touch命令显式地将文件的时间戳的亚秒部分归零。其他文件创建方法不一定如此, 在clearcase V8动态视图中,这会导致make的“有趣”排序问题。
为什么使用此utimensat
系统调用会触及文件的亚秒修改时间为零?
编辑:dg99指出这个API,正如strace指示的方式所调用的可能是尝试将时间设置为当前时间,而不是清除时间的亚秒部分,如所观察到的那样。为了重复这一点,我尝试了对utimensat
(fd,NULL,NULL,0)的调用,但这会产生一个EINVAL。事实证明,strace正在撒谎(也许是轻微的:可能同一个内核系统调用同时执行utimensat
和futimens
API),而touch.c实际上正在做的是:
269 result = futimens (fd, ts);
(gdb) s
272 if (0 < result)
(gdb) p fd
$4 = 0
(gdb) p ts
$5 = (struct timespec *) 0x0
以这种方式调用一些独立代码,使用futimes
也可以使用clearcase版本8 MVFS清除亚秒部分时间。
答案 0 :(得分:1)
从我对utimensat
手册页的阅读中,上面的调用没有明确地将任何内容设置为零,而是将访问和修改时间戳设置为当前时间:
int utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags);
...新文件时间戳在数组中指定...如果时间为NULL,则两个时间戳都设置为当前时间。