[英]Why does touch include a utimensat() syscall?
在查看文件mtimes的奇数时间顺序时,我注意到(gnu) touch
命令包括utimensat
syscall作为其触摸序列的一部分:
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命令将文件时间戳的亚秒部分显式归零。 文件创建的其他方法不一定要这样做,在清晰的V8动态视图中,这会导致make产生“有趣的”排序问题。
为什么使用此utimensat
syscall将文件的亚秒级修改时间utimensat
?
编辑:dg99指出,按照strace指示的方式调用的此API可能是尝试将时间设置为当前时间,而不是观察到的清除时间的亚秒部分。 为了对此进行重现,我尝试了对utimensat
的调用(fd,NULL,NULL,0),但这会产生EINVAL。 事实证明strace在说谎(也许稍微:也许同一个内核syscall既执行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清除了时间的亚秒部分。
根据我对utimensat
手册页的阅读,上述调用不是将任何内容显式设置为零,而是将访问和修改时间戳记都设置为当前时间:
int utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags);
...新的文件时间戳记在数组times中指定。如果times为NULL,则两个时间戳记均设置为当前时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.