rename
seja atômico: seja totalmente concluído ou não seja totalmente. Renomear A para tomar o lugar de B deve deixá-lo com A e B intactos (isso não aconteceu); ou com apenas o conteúdo de A sob o nome B (completou completamente).
Contanto que o sistema não trave, isso acontecerá independentemente das chamadas fsync
(etc.).
Se o sistema falhar, no entanto, pode acontecer que o próprio nome mude para o disco (e, portanto, seja completado). Lembre-se que esses nomes! = Arquivos. Arquivos / inodes podem ter vários nomes. Renomear está mudando os nomes, não os arquivos / dados subjacentes.
Assim, você pode ter o estado em que seu programa escreveu A, renomeá-lo para substituir B e, em seguida, a energia acabou. Acontece que o sistema de arquivos escreveu a renomeação para o disco, mas não os dados reais em A. Não é necessário sem fsync
. Assim, você acaba com um B de comprimento zero ou um B com zero.
A razão pela qual um aplicativo faz um arquivo write-temp + renomear em vez de simplesmente sobrescrever o arquivo é porque ele quer segurança contra falhas. O usuário não ficará muito zangado se uma cópia temporária de seu importante documento for deixada por aí, ao lado da cópia em bom estado. Mas se não houver boas cópias, o usuário não ficará satisfeito.