Объяснение в
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()
. В противном случае, это не для системных вызовов, но это ответственность приложения.
Что я здесь не понимаю?