O que acontece quando você lê um arquivo enquanto ele é sobrescrito?

24

Suponha que eu leia (cat) um arquivo enquanto outro processo está reescrevendo seu conteúdo. A saída é previsível? O que aconteceria?

    
por Leven 26.06.2012 / 15:38

2 respostas

19

Isso depende do que o escritor faz.

Se o gravador sobrescrever o arquivo existente, o leitor verá o novo conteúdo quando o gravador ultrapassar o leitor, se for o caso. Se o escritor e o leitor prosseguirem a velocidades variáveis, o leitor poderá, alternativamente, ver conteúdos antigos e novos.

Se o gravador truncar o arquivo antes de começar a escrever, o leitor será executado no final do arquivo nesse ponto.

Se o gravador criar um novo arquivo e, em seguida, mover o novo arquivo para o nome antigo, o leitor continuará lendo o arquivo antigo. Se um arquivo aberto for movido ou removido, os processos que tiverem o arquivo aberto continuarão lendo desse mesmo arquivo. Se o arquivo for removido, ele realmente permanecerá no disco (mas não terá como abri-lo novamente) até que o último processo tenha sido fechado.

Os sistemas Unix tendem a não ter bloqueios obrigatórios. Se um aplicativo quiser garantir que seu componente escritor e seu componente leitor não peguem os dedos uns dos outros, cabe ao desenvolvedor usar o bloqueio adequado. Existem algumas exceções em que um arquivo aberto pelo kernel pode ser protegido contra gravação por aplicativos do usuário, por exemplo, um loop imagem do sistema de arquivos montada ou um executável que está sendo executado em algumas variantes unix.

    
por 27.06.2012 / 02:40
18

É uma condição clássica de corrida, então o resultado é imprevisível por definição.

Entre outros, depende de

  • fopen(3) ou open(2) modos de gravação,
  • como / se o escritor estiver armazenando em buffer sua saída,
  • como o leitor está lendo o arquivo,
  • a diferença de velocidade entre o leitor e o escritor,
  • a diferença horária entre o início da leitura e do autor.
  • E, é claro, nas máquinas com vários núcleos modernos, as coisas são ainda mais complicadas por outros fatores mais baixos (por exemplo, agendamento de processos).

Se você precisar ler um arquivo enquanto ele está sendo reescrito, você pode fazer o gravador fazer uma cópia temporária do arquivo, modificá-lo e copiá-lo de volta para o arquivo original. É assim que o rsync faz isso, por exemplo. Existem várias maneiras de implementar isso, mas não há almoço grátis. Cada método tem suas próprias deficiências e repercussões.

    
por 26.06.2012 / 16:21

Tags