【发布时间】:2020-11-22 23:58:08
【问题描述】:
这是一个非常具体的问题
我主要对运行touch . 时发生的 open() 系统调用感兴趣。
于是我跑了strace touch .,看到opennat()被调用了3次。
但我并不真正了解发生了什么;因为touch . 不会在控制台中打印任何内容,也不会创建名为“.”的新文件。自从 ”。”是一个指向当前文件夹的指针,可以通过运行ls -a 看到,因此不会创建任何内容,因为该名称已在使用中。
这是我的假设: 调用 open() 来检查指定的文件名是否已经存在,如果返回文件描述符,则表示该名称已在使用中,操作被取消。
如果我错了,请纠正我。
【问题讨论】:
-
可能您必须指定
touch(和供应商)的确切版本。我有 GNU coreutils 8.32,其touch的行为符合预期:调用单个openat(2)来创建可能不存在的文件,并调用单个utimensat(2)来更改访问时间。 -
而且我相信查找和阅读源代码比猜测更容易。
touch是一个很简单的东西。 -
我的版本也是运行在redhat上的GNU coreutils 8.32。我确实阅读了文档 [链接] (man7.org/linux/man-pages/man1/touch.1.html),但我没有找到太多关于系统调用的信息。只需在谷歌上搜索它即可返回基本的初学者触摸教程。
标签: linux operating-system system-calls