linux - 在linux中调用```touch .```会发生什么?
问题描述
这是一个非常具体的问题
我主要对运行时发生的 open() 系统调用感兴趣touch .
。所以我跑了strace touch .
,看到 opennat() 被调用了 3 次。
但我并不真正了解发生了什么;astouch .
不会在控制台中打印任何内容,也不会创建名为“.”的新文件。自从 ”。” 是指向当前文件夹的指针,可以通过运行查看,ls -a
因此不会创建任何内容,因为该名称已在使用中。
这是我的假设:调用 open() 以检查指定的文件名是否已存在,如果返回文件描述符,则表示该名称已在使用中,操作被取消。
如果我错了,请纠正我。
解决方案
GNUtouch
在触摸文件时更喜欢使用文件描述符,因为可以写入touch - > foo
并期望文件foo
被触摸。结果,它总是尝试将指定的路径作为可写文件打开,如果可能的话,它会使用该文件描述符来更新文件时间戳。
在这种情况下,无法打开.
写入,因此openat
返回EISDIR
。 touch
注意到它是一个目录,所以它对其内部fdutimensat
函数的调用得到一个无效的文件描述符并回退到使用utimensat
而不是futimens
.
调用并非openat
用于检查文件是否存在,而是将文件描述符用于许多操作意味着您不必多次处理路径解析或处理符号链接,因为所有这些在打开文件描述符时解析。这就是为什么许多长期存在的程序选择打开一个文件描述符到它们当前的工作目录,然后更改目录,然后使用文件描述符fchdir
更改回来。程序启动后对权限的任何更改都不是问题。
推荐阅读
- c++ - 矩形类中没有匹配函数
- uvm - 如何使用 p_sequencer 按顺序访问 sequencer 中的方法?
- c# - mvvm 解决嵌套模型和视图模型
- mongodb - 嵌入式文档中的 MongoDB 嵌套查找
- php - 如何恢复 Plesk Cpanel 文件
- javascript - Chart.js中x轴上的自定义标签/固定范围用于水平条形图?
- javascript - 根据 Gatsby 中的 url 更改字体颜色
- visual-studio-code - 如何在 VS Code 中更改终端的语言
- spring - 无法将 thymeleaf springsecurity 或布局方言添加到我的应用程序
- c# - 使用 Gremlin.net 读取/保存文件