Se os diretórios estão na mesma partição de hardware montada como um único sistema de arquivos , então mover algo é apenas renomeá-lo para um caminho diferente. No entanto, se não estiverem, cada arquivo interno precisará ser lido e copiado, portanto nenhuma parte do movimento será atômica. Como aponta Gilles, o POSIX determina que esse seja o caso para sistemas de arquivos discretos.
Exceto que, uma verificação rápida com strace
confirma mv
usa a chamada de sistema rename()
(não confundir com rename
, o utilitário de linha de comando). Isso tornaria mv
ing um diretório atômico de uma perspectiva de espaço de usuário. A chamada do sistema rename()
apresentará um erro EBUSY se:
oldpath or newpath is a directory that is in use by some process (perhaps as current working directory, or as root directory, or because it was open for reading) or is in use by the system (for example as mount point), while the system considers this an error. (Note that there is no requirement to return EBUSY in such cases—there is nothing wrong with doing the rename anyway—but it is allowed to return EBUSY if the system cannot otherwise handle such situations.)
De man 2 rename
. A conexão com "atomicidade" aqui é que você não pode interromper outro processo trabalhando no diretório, e outro processo não pode interromper isso - ele vai acabar com um erro de caminho inválido / não encontrado se você o vencer a perseguição.