Como os arquivos abertos se comportam nos sistemas linux?

17

Acabei de renomear um arquivo de log para "foo.log.old" e assumi que o aplicativo começará a gravar um novo arquivo de log em "foo.log". Fiquei surpreso ao descobrir que ele rastreou o arquivo de log em seu novo nome e continuou anexando linhas a "foo.log.old".

No Windows, não estou familiarizado com esse tipo de comportamento - não sei se é possível implementá-lo. Como exatamente esse comportamento é implementado no linux? Onde posso aprender mais sobre isso?

    
por ripper234 20.02.2011 / 13:44

2 respostas

20

Os programas conectam-se a arquivos através de um número mantido pelo sistema de arquivos (chamado de inode em sistemas de arquivos unix tradicionais), para o qual o nome é apenas uma referência (e possivelmente não uma referência única).

Tantas coisas para se conhecer:

  1. Mover um arquivo usando mv não altera esse número de sublinhado, a menos que você o mova nos sistemas de arquivos (o que equivale a usar cp , em seguida, rm no original).
  2. Como mais de um nome pode se conectar a um único arquivo (ou seja, temos hard links), os dados dos arquivos "excluídos" não desaparecem até que todas as referências ao arquivo subjacente desapareçam .
  3. Talvez o mais importante: quando um programa open s um arquivo faz uma referência a ele que é (para os propósitos de quando os dados serão excluídos) equivalente a ter um nome de arquivo conectado a ele.

Isso dá origem a vários comportamentos como:

  • Um programa pode open um arquivo para leitura, mas na verdade não o lê até depois do usuário como rm ed na linha de comando, e o programa ainda terá acesso aos dados
  • O que você encontrou: mv ing de um arquivo não desconecta o relacionamento entre o arquivo e nenhum programa que o tenha aberto (a menos que você se mova pelos limites do sistema de arquivos, caso em que o programa ainda tem uma versão do original trabalhar em).
  • Se um programa tiver open ed um arquivo para gravação, e o usuário rm s for o último nome de arquivo na linha de comando, o programa pode continuar colocando coisas no arquivo, mas assim que ele for fechado não haverá mais referência a esses dados e desaparecerá.
  • Dois programas que se comunicam por meio de um ou mais arquivos podem obter uma segurança total e parcial, removendo o (s) arquivo (s) depois que terminarem open ing. (Isto não é real segurança mental, apenas transforma um buraco em uma condição de corrida.)
por 20.02.2011 / 16:12
0

Para realmente ver como esse comportamento é implementado, você pode ver alguns livros de programação Unix. Mathepic está certo em que está relacionado a um inode. O nome do caminho atual é usado apenas para abrir o arquivo, uma vez feito isso, o programa faz referência a ele pelo descritor de arquivo aberto. O descritor de arquivo, por sua vez, faz referência ao inode, que neste caso não se importa se o nome do arquivo subjacente foi alterado.

No que diz respeito a implementar isso no Windows, essa é uma pergunta para outro site.

Para ler mais sobre isso sem acessar os livros, basta procurar por sistemas de arquivos e inodes linux. Pode não haver uma resposta clara, mas você poderá entender o motivo.

    
por 20.02.2011 / 14:44