1

Объяснение в

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 ответ1

0

Гонка относится только к файлам, которых нет в текущем каталоге. Относительный путь, который вы передаете openat(), может содержать символическую ссылку, которая указывает на каталог, отличный от того, который вы ожидаете.

Если вы используете open() только с файлами в текущем каталоге (после того, как убедитесь, что находитесь там, где хотите), вы избежите этой проблемы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .