解释如下:
http://man7.org/linux/man-pages/man2/open.2.html
关于为什么openat
需要,部分内容如下:
openat() allows an application to avoid race conditions that
could occur when using open() to open files in directories other than
the current working directory. These race conditions result from the
fact that some component of the directory prefix given to open()
could be changed in parallel with the call to open(). Suppose, for
example, that we wish to create the file path/to/xxx.dep if the file
path/to/xxx exists. The problem is that between the existence check
and the file creation step, path or to (which might be symbolic
links) could be modified to point to a different location.
我不明白为什么这种竞争会成为问题。如果某个应用想要检查某个文件是否存在,如果存在,则创建一个不同的文件,那么,当然这是两个步骤,应用程序应该并且可以确保两者之间没有任何干扰。只有当单个调用open()
可能导致竞争条件时,才可能需要其他系统调用openat()
。否则,这不是系统调用要解决的问题,而是应用程序的责任。
我在这里不明白什么?
答案1
竞争仅指当前目录中不存在的文件。您传递给 openat() 的相对路径可能包含指向与您预期不同的目录的符号链接。
如果您仅对当前目录中的文件使用 open()(确保您位于您想要的位置之后),则可以避免这个问题。