O Linux exclui um arquivo de maneira completamente diferente do que o Windows faz. Primeiro, uma breve explicação sobre como os arquivos são gerenciados nos sistemas de arquivos * unix nativos.
O arquivo é mantido no disco na estrutura multinível chamada i-node
. Cada nó i tem um número exclusivo no sistema de arquivos único. A estrutura do i-node mantém informações diferentes sobre um arquivo, como seu tamanho, blocos de dados alocados para o arquivo etc., mas, em nome dessa resposta, o elemento de dados mais importante é um link counter
. Os directories
são os arquivos que mantêm registros sobre os arquivos. Cada registro tem o número do nó i a que ele se refere, o comprimento do nome do arquivo e o próprio nome do arquivo. Este esquema permite que se tenha 'ponteiros', isto é 'links' para o mesmo arquivo em lugares diferentes com nomes diferentes. O contador de links do i-node na verdade mantém o número de links que se referem a esse nó i.
O que acontece quando algum processo abre o arquivo? Primeiro, a função open()
procura o registro do arquivo. Em seguida, ele verifica se a estrutura do nó i na memória para esse nó i já existe. Isso pode acontecer se algum aplicativo já tiver esse arquivo aberto. Caso contrário, o sistema inicializa uma nova estrutura de nó i na memória. Em seguida, o sistema aumenta o contador de abertura da estrutura do nó i na memória e retorna ao aplicativo seu descritor de arquivo.
A chamada da biblioteca do Linux para excluir um arquivo é chamada de unlink
. Esta função remove o registro do arquivo de um diretório e decrementa o contador de links do i-node. Se o sistema descobrir que existe uma estrutura de nó i na memória e seu contador aberto não for zero, essa chamada retornará o controle para o aplicativo. Caso contrário, ele verifica se o contador de links se tornou zero e, se isso ocorrer, o sistema libera todos os blocos alocados para o nó i e o próprio nó i e retorna para o aplicativo.
O que acontece quando um aplicativo fecha um arquivo? A função close()
decrementa o contador aberto e verifica seu valor. Se o valor for diferente de zero, a função retornará ao aplicativo. Caso contrário, ele verifica se o contador de links do nó i é zero. Se for zero, libera todos os blocos do arquivo e o nó i antes de retornar ao aplicativo.
Esse mecanismo permite "excluir" um arquivo enquanto ele é aberto. Ao mesmo tempo, o aplicativo que abriu um arquivo ainda tem acesso aos dados no arquivo. Portanto, o JRE, em seu exemplo, ainda mantém sua versão do arquivo aberta enquanto há outra versão atualizada no disco.
Mais ainda, esse recurso permite que você atualize o glibc (libc) - a biblioteca principal de todos os aplicativos - em seu sistema sem interromper sua operação normal.
Windows
20 anos atrás, não conhecíamos nenhum outro sistema de arquivos além do FAT no DOS. Esse sistema de arquivos tem uma estrutura e princípios de gerenciamento diferentes. Esses princípios não permitem excluir um arquivo quando ele é aberto, portanto, o DOS e, mais recentemente, o Windows precisam negar qualquer solicitação de exclusão em um arquivo que esteja aberto. Provavelmente o NTFS permitiria o mesmo comportamento que os sistemas de arquivos * nix, mas a Microsoft decidiu manter o comportamento habitual da exclusão do arquivo.
Esta é a resposta. Não é curto, mas agora você tem a ideia.
Editar :
Uma boa leitura sobre fontes de Win32
mess: link
Créditos para @Jon