首页 > 解决方案 > 在linux中调用```touch .```会发生什么?

问题描述

这是一个非常具体的问题

我主要对运行时发生的 open() 系统调用感兴趣touch .。所以我跑了strace touch .,看到 opennat() 被调用了 3 次。

但我并不真正了解发生了什么;astouch .不会在控制台中打印任何内容,也不会创建名为“.”的新文件。自从 ”。” 是指向当前文件夹的指针,可以通过运行查看,ls -a因此不会创建任何内容,因为该名称已在使用中。

这是我的假设:调用 open() 以检查指定的文件名是否已存在,如果返回文件描述符,则表示该名称已在使用中,操作被取消。

如果我错了,请纠正我。

标签: linuxoperating-systemsystem-calls

解决方案


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

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

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


推荐阅读