A página man para cp(1)
diz
--no-clobber
não sobrescreva um arquivo existente
No entanto, o cenário a seguir não seria possível?
cp
verifica a existência do arquivo, vamos supor que o arquivo não exista (ainda)- Algum outro processo grava no mesmo caminho, então agora há dados gravados no arquivo anteriormente não existente
- Como
cp
não está ciente do arquivo agora existente, ele substitui os dados
É cp --no-clobber
vulnerável a esta condição de corrida? E se não, como cp
evitar a situação acima?
cp
não é vulnerável a esta condição de corrida. Quando--no-clobber
definido, verifica se o destino já existe; se ele determinar que não, e deve, portanto, prosseguir com a cópia, ele lembra que deve copiar para um novo arquivo. Quando chega a hora de abrir o arquivo de destino, ele o abre com sinalizadores que impõem sua criaçãoO_CREAT
eO_EXCL
; o sistema operacional então verifica se o arquivo não existe ao abri-lo e falha (EEXIST
) se existir.