繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM