【问题标题】:what happens when calling ```touch .``` in linux?在linux中调用```touch .```会发生什么?
【发布时间】: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


【解决方案1】:

GNU touch 在接触文件时更喜欢使用文件描述符,因为可以写入 touch - > foo 并期望文件 foo 被接触。因此,它总是尝试将指定路径作为可写文件打开,如果可能的话,它会使用该文件描述符来更新文件时间戳。

在这种情况下,无法打开. 进行写入,因此openat 返回EISDIRtouch 注意到它是一个目录,因此它对其内部 fdutimensat 函数的调用获取了一个无效的文件描述符并回退到使用 utimensat 而不是 futimens

openat 调用并非用于检查文件是否存在,而是将文件描述符用于许多操作意味着您不必多次处理路径解析或处理符号链接,因为所有这些都是在打开文件描述符时解析的。这就是为什么许多长期存在的程序选择打开一个文件描述符到它们当前的工作目录,然后更改目录,然后使用带有fchdir 的文件描述符改回来。程序启动后对权限的任何更改都不是问题。

【讨论】:

  • 您已经回答了我的问题,谢谢。我的理解是目录也具有类似于文件的文件描述符,这就是使用 open() 的原因。再次感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多