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?
files
open-files
rename
ripper234
fonte
fonte
Respostas:
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:
mv
não altera esse número subjacente, a menos que você o mova pelos sistemas de arquivos (o que equivale a usácp
-lorm
no original).open
um 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:
open
um arquivo para leitura, mas na verdade não o lê até que o usuário orm
edite na linha de comando, e o programa ainda terá acesso aos dados .mv
um 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).open
editado um arquivo para gravação e orm
ú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.open
. (Isso não é uma questão de segurança real , apenas transforma um buraco em uma condição de corrida.)fonte
open
um arquivo para leitura e gravação (como o que aconteceu com o arquivo de log na pergunta).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ê.
fonte