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 escrever um novo arquivo de log em "foo.log". Fiquei surpreso ao descobrir que ele rastreava o arquivo de log com seu novo nome e continuava 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?


Não estou colocando isso como resposta, porque realmente não sei, mas acho que tem a ver com os inodes que não são alterados quando você move um arquivo.
mathepic

Respostas:


20

Os programas se conectam aos arquivos por meio de um número mantido pelo sistema de arquivos (chamado de inode nos sistemas de arquivos unix tradicionais), aos quais o nome é apenas uma referência (e possivelmente não é uma referência exclusiva).

Portanto, várias coisas para estar ciente:

  1. Mover um arquivo usando mvnão altera esse número subjacente, a menos que você o mova pelos sistemas de arquivos (o que equivale a usá cp-lo rmno original).
  2. Como mais de um nome pode se conectar a um único arquivo (ou seja, temos links físicos), os dados nos arquivos "excluídos" não desaparecem até que todas as referências ao arquivo subjacente sejam removidas.
  3. Talvez o mais importante: quando um programa é openum arquivo, ele faz uma referência a ele que é (para fins de quando os dados serão excluídos) o equivalente a ter um nome de arquivo conectado a ele.

Isso dá origem a vários comportamentos como:

  • Um programa pode openum arquivo para leitura, mas na verdade não o lê até que o usuário o rmedite na linha de comando, e o programa ainda terá acesso aos dados .
  • O que você encontrou: mvum arquivo não desconecta o relacionamento entre o arquivo e os programas que o abrem (a menos que você mova os limites do sistema de arquivos, caso em que o programa ainda possui uma versão do original para trabalhar).
  • Se um programa tiver openeditado um arquivo para gravação e o rmúltimo nome de arquivo do usuário estiver na linha de comando, o programa poderá continuar colocando as coisas no arquivo, mas assim que for fechado, não haverá mais referência a esses dados e isso vai embora.
  • Dois programas que se comunicam por meio de um ou mais arquivos podem obter uma segurança parcial e bruta removendo o (s) arquivo (s) após o término open. (Isso não é uma questão de segurança real , apenas transforma um buraco em uma condição de corrida.)

1
Eu concordo com o @dmckee, só queria observar: um programa pode openum arquivo para leitura e gravação (como o que aconteceu com o arquivo de log na pergunta).
Jsbillings

@jsbillings: Sim, mas há um risco. Se todos os nomes de sistema de arquivos tiverem desaparecido, você poderá gravar GBs em um arquivo aberto que evaporará como o orvalho da manhã assim que você o fechar.
dmckee

1
Além disso, o inode é copiado no kernel e é nisso que é operado, não a cópia do disco. Portanto, o arquivo pode ser mv'd ou cp ', mas um arquivo aberto já está trabalhando com as estruturas de dados kernal, não com a versão do disco. Portanto, se você copiar outro arquivo para o arquivo aberto para gravação, o processo ainda gravará na mesma posição relativa que no arquivo antigo. Essa é a razão pela qual programas, como o Apache httpd, possuem um manipulador de sinais que fecha e reabre os arquivos de log.
Arcege 20/02

0

Para realmente ver como esse comportamento é implementado, você pode ver alguns livros de programação do Unix. O Mathepic está certo no que se refere a um inode. O nome do caminho real é usado apenas para abrir o arquivo, uma vez que o programa é referenciado por seu descritor de arquivo aberto. O descritor de arquivo, por sua vez, faz referência ao inode, que nesse caso não se importa se o nome do arquivo subjacente foi alterado.

No que diz respeito à implementação 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ê será capaz de entender o porquê.


4
"Pesquise ao redor - você provavelmente não encontrará uma boa resposta, mas a entenderá" não é uma boa resposta.
mattdm
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.