Объяснение на
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() только с файлами в текущем каталоге (убедившись, что вы находитесь там, где хотите), вы избежите этой проблемы.