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