为什么touch包含utimensat()系统调用?

时间:2015-02-25 17:04:19

标签: file unix

查看文件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正在撒谎(也许是轻微的:可能同一个内核系统调用同时执行utimensatfutimens 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清除亚秒部分时间。

1 个答案:

答案 0 :(得分:1)

从我对utimensat手册页的阅读中,上面的调用没有明确地将任何内容设置为零,而是将访问和修改时间戳设置为当前时间:

int utimensat(int dirfd, const char *pathname,
              const struct timespec times[2], int flags);
     

...新文件时间戳在数组中指定...如果时间为NULL,则两个时间戳都设置为当前时间。