为什么需要 openat() 来避免与 stat 和 open() 的两步竞争条件?

为什么需要 openat() 来避免与 stat 和 open() 的两步竞争条件?

解释如下:

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()(确保您位于您想要的位置之后),则可以避免这个问题。

相关内容