Уязвим ли `cp --no-clobber` к состоянию гонки?

Уязвим ли `cp --no-clobber` к состоянию гонки?

Страница руководства дляcp(1)говорит

--no-clobberне перезаписывать существующий файл

Однако разве не возможен следующий сценарий?

  1. cpпроверяет существование файла, предположим, что файл не существует (пока)
  2. Какой-то другой процесс записывает данные по тому же пути, поэтому теперь данные записываются в ранее не существовавший файл.
  3. Так как cpон не знает о существующем файле, он перезаписывает данные

Уязвим ли cp --no-clobberк этому состоянию гонки? И если нет, как cpизбежать ситуации выше?

решение1

cpне уязвим к этому состоянию гонки. Когда --no-clobberустановлено, он проверяет, существует ли уже место назначения; если он определяет, что его нет, и поэтому он должен продолжить копирование, он помнит, что он должен копировать в новый файл. Когда приходит время открыть файл назначения,он открывает его с флагами, которые обеспечивают его создание,O_CREATиO_EXCL; затем операционная система проверяет, что файл не существуетпри его открытии, и завершается неудачей ( EEXIST), если это так.

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