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

Связанный контент