Contanto que você não mova o arquivo pelas bordas do sistema de arquivos, a operação deve ser segura. Isso se deve ao mecanismo, como a “movimentação” é realmente feita.
Se você mv
um arquivo no mesmo sistema de arquivos, o arquivo não é realmente tocado, mas apenas a entrada do sistema de arquivos é alterada.
$ mv foo bar
na verdade faz algo como
$ ln foo bar
$ rm foo
Isso criaria um link hard (uma segunda entrada de diretório) para o arquivo (na verdade, o inode apontado pela entrada do sistema de arquivos) foo
named bar
e removeria a entrada foo
. Desde agora, ao remover foo
, há uma segunda entrada no sistema de arquivos apontando para o inode de foo
, removendo a entrada antiga foo
, na verdade, não remove nenhum bloco pertencente ao inode.
Seu programa seria feliz para anexar ao arquivo de qualquer maneira, desde o seu identificador de arquivo aberto aponta para o inode do arquivo, não a entrada do sistema de arquivos.
Nota: Se o seu programa fechar e reabrir o arquivo entre as gravações, você acabaria tendo um novo arquivo criado com a entrada do sistema de arquivos antigo!
Movimentos entre sistemas de arquivos cruzados:
Se você mover o arquivo pelas bordas do sistema de arquivos, as coisas ficarão feias. Nesse caso, você não poderia garantir a consistência do arquivo, já que mv
na verdade
- crie um novo arquivo no sistema de arquivos de destino
- copie o conteúdo do arquivo antigo para o novo arquivo
- remova o arquivo antigo
ou
$ cp /path/to/foo /path/to/bar
$ rm /path/to/foo
resp.
$ touch /path/to/bar
$ cat < /path/to/foo > /path/to/bar
$ rm /path/to/foo
Dependendo se a cópia chegar ao final do arquivo durante a gravação do seu aplicativo, pode acontecer de você ter apenas metade de uma linha no novo arquivo.
Além disso, se seu aplicativo não fechar e reabrir o arquivo antigo, ele continuará gravando no arquivo antigo, mesmo que pareça ser excluído: o kernel sabe quais arquivos estão abertos e, embora ele exclua o sistema de arquivos entrada, ele não excluirá o inode do arquivo antigo e os blocos associados até que seu aplicativo feche o identificador de arquivos aberto.