É mv atômico no meu fs?

6

Como posso verificar se mv é atômico no meu fs (ext4)?

O SO é o Servidor Red Hat Enterprise Linux versão 6.8.

Em geral, como posso verificar isso? Eu olhei em volta e não encontrei se o meu sistema operacional é POSIX padrão.

    
por Antonio Calì 09.11.2016 / 09:25

2 respostas

6

Curiosamente, parece que a resposta pode ser: "Depende".

Para ficar claro, mv é especificado para

The mv utility shall perform actions equivalent to the rename() function

A especificação de função de renomeação declara:

This rename() function is equivalent for regular files to that defined by the ISO C standard. Its inclusion here expands that definition to include actions on directories and specifies behavior when the new parameter names a file that already exists. That specification requires that the action of the function be atomic.

Mas a mais recente a especificação ISO C para rename() afirma:

7.21.4.2 The rename function

Synopsis

#include <stdio.h>
int rename(const char *old, const char *new);

Description

The rename function causes the file whose name is the string pointed to by old to be henceforth known by the name given by the string pointed to by new. The file named old is no longer accessible by that name. If a file named by the string pointed to by new exists prior to the call to the rename function, the behavior is implementation-defined.

Returns

The rename function returns zero if the operation succeeds, nonzero if it fails, in which case if the file existed previously it is still known by its original name.

Surpreendentemente, observe que não há exigência explícita de atomicidade. Pode ser necessário em algum outro lugar no C Standard mais recente disponível publicamente, mas não consegui encontrá-lo. Se alguém puder encontrar esse requisito, edições e comentários serão mais do que bem-vindos.

Veja também A renomeação () é atômica?

Por a página de manual do Linux :

If newpath already exists, it will be atomically replaced, so that there is no point at which another process attempting to access newpath will find it missing. However, there will probably be a window in which both oldpath and newpath refer to the file being renamed.

A página man do Linux afirma que o substituto do arquivo será atômico.

Testando e verificando que a atomicidade pode ser muito difícil, se for até onde você precisa ir. Você não está claro sobre o que você quer dizer com o uso de "Como posso verificar se o mv é atômico". Você quer requisitos / especificação / documentação que é atômica, ou você precisa realmente testar isso?

Note também que os acima assumem que os nomes dos dois arquivos de operandos estão no mesmo sistema de arquivos. Não consigo encontrar nenhuma restrição padrão no utilitário mv para impor isso.

    
por 09.11.2016 / 12:53
1

mv é baseado na chamada de sistema rename e rename() é atômica. Você poderia olhar para a página de manual rename(2) .

Você pode encontrar resposta em É rename () atômico? em stackoverflow.

Que tipo de fs você usou?

    
por 09.11.2016 / 11:33

Tags