簡體   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