Por que o Debian prefere um arquivo temporário substituindo o original por modificação de bytes no arquivo original?

1

Na% man_de% manpages, você pode ler o seguinte:

   -t        mp3gain  writes  modified  mp3  to  temp  file,  then deletes
             original instead of modifying bytes in original file (This is
             the default in Debian)

   -T        mp3gain modifies bytes in original file instead of writing to
             temp file.

A maioria das distros (e do Windows) alteram alguns bytes (se possível, no espaço de tags acolchoado dos mp3, eu acho). Isso tem a vantagem de ser mais rápido. Especialmente ao marcar milhares de arquivos. Isto também tem o benefício adicional de apenas sincronizar o cluster modificado para, e. Dropbox.

O Debian, no entanto, reescreve todo o arquivo, incluindo os bytes alterados, em um arquivo temporário, após o qual o arquivo original é substituído pelo arquivo temporário.

Eu gostaria de saber por que exatamente isso é. Eu gostaria de saber a (s) razão (ões) real (ais) de alguém que sabe disso por um fato. (Você é livre para fazer um palpite, mas eu posso evitar aceitar sua resposta até conseguir mais).

    
por Redsandro 03.11.2014 / 21:38

3 respostas

2

Sua pergunta sugere que o Debian usa arquivos temporários para todas as gravações, o que não é o caso. Este é simplesmente o padrão para mp3gain .

Na versão 1.4.3-2, o mantenedor do pacote (Stefan Fritsch) decidiu que, como gravar um arquivo temporário é muito mais rápido no ReiserFS, este seria o padrão no Debian. Isso foi obtido do patch em < a href="https://packages.debian.org/source/squeeze/mp3gain"> link

Os mantenedores de pacotes em outras distros presumivelmente não concordaram com Stefan e, portanto, não alteraram o padrão de não usar arquivos temporários.

    
por 03.11.2014 / 22:32
2

Você deve nunca modificar um arquivo no lugar. As únicas maneiras seguras de escrever um arquivo são:

  1. se você for o primeiro a criar o arquivo ( O_EXCL ).
  2. escrevendo para um novo arquivo temporário e, em seguida, executando um (atômico) rename(2) .
  3. abrindo o arquivo no modo somente anexo ( O_APPEND ).

Caso contrário, você irá perder dados o tempo todo, seja quando o seu programa falhar (não minta e diga que seu programa é perfeito) ou quando você perder energia.

Existem muitos aplicativos importantes que ainda não aprenderam essas regras; Eu culpo o fato de que existe uma opção para abrir um arquivo no modo write-truncate (já que não há nenhum uso para isso).

    
por 03.11.2014 / 22:11
1

A alteração de um arquivo nem sempre é fácil.

Se você adicionar data no meio de um arquivo, o tamanho aumentará e todos os dados após a alteração deverão ser gravados em um novo local. Se você primeiro gravar os dados no meio do arquivo, precisará armazenar os dados antigos para movê-los e esperar não travar no meio desse processo. É muito mais fácil simplesmente escrever o resultado em um novo arquivo.

Escrever em um novo arquivo (e depois substituí-lo pelo arquivo original) também tem a vantagem de que qualquer processo que acesse o arquivo antigo poderá continuar seu trabalho sem ser perturbado. Se você mudar as coisas nesse arquivo, tal processo pode ficar um pouco confuso.

    
por 03.11.2014 / 22:14