在 linux 中调用 ```touch.``` 时会发生什么?
what happens when calling ```touch .``` in linux?
这是一个非常具体的问题
我主要对 运行 touch .
时发生的 open() 系统调用感兴趣。
所以我 运行 strace touch .
看到 opennat() 被调用了三次。
但我不太明白发生了什么;因为 touch .
不会在控制台中打印任何内容,也不会创建名为“.”的新文件。自从 ”。”是指向当前文件夹的指针,运行 ls -a
可以看到,因此不会创建任何内容,因为该名称已被使用。
这是我的假设:
调用 open() 来检查指定的文件名是否已经存在,如果返回一个文件描述符,这意味着该名称已经在使用并且操作被取消。
如有错误请指正
GNU touch
更喜欢在访问文件时使用文件描述符,因为可以写入 touch - > foo
并期望文件 foo
被访问。因此,它总是尝试将指定路径作为可写文件打开,如果可能的话,它会使用该文件描述符来更新文件时间戳。
在这种情况下,无法打开.
进行写入,因此openat
returns EISDIR
。 touch
注意到它是一个目录,因此它对其内部 fdutimensat
函数的调用得到了一个无效的文件描述符,并回退到使用 utimensat
而不是 futimens
.
openat
调用并非用于检查文件是否存在,而是使用文件描述符进行许多操作意味着您不必处理路径解析多次或处理符号链接,因为所有这些都在打开文件描述符时解析。这就是为什么很多长寿命程序选择打开一个文件描述符到当前工作目录,然后改变目录,然后用带fchdir
的文件描述符改回来。程序启动后对权限的任何更改都不是问题。
这是一个非常具体的问题
我主要对 运行 touch .
时发生的 open() 系统调用感兴趣。
所以我 运行 strace touch .
看到 opennat() 被调用了三次。
但我不太明白发生了什么;因为 touch .
不会在控制台中打印任何内容,也不会创建名为“.”的新文件。自从 ”。”是指向当前文件夹的指针,运行 ls -a
可以看到,因此不会创建任何内容,因为该名称已被使用。
这是我的假设: 调用 open() 来检查指定的文件名是否已经存在,如果返回一个文件描述符,这意味着该名称已经在使用并且操作被取消。
如有错误请指正
GNU touch
更喜欢在访问文件时使用文件描述符,因为可以写入 touch - > foo
并期望文件 foo
被访问。因此,它总是尝试将指定路径作为可写文件打开,如果可能的话,它会使用该文件描述符来更新文件时间戳。
在这种情况下,无法打开.
进行写入,因此openat
returns EISDIR
。 touch
注意到它是一个目录,因此它对其内部 fdutimensat
函数的调用得到了一个无效的文件描述符,并回退到使用 utimensat
而不是 futimens
.
openat
调用并非用于检查文件是否存在,而是使用文件描述符进行许多操作意味着您不必处理路径解析多次或处理符号链接,因为所有这些都在打开文件描述符时解析。这就是为什么很多长寿命程序选择打开一个文件描述符到当前工作目录,然后改变目录,然后用带fchdir
的文件描述符改回来。程序启动后对权限的任何更改都不是问题。