Respostas:
O motivo é que o Unix não bloqueia um arquivo executável enquanto ele é executado ou, mesmo que goste do Linux, esse bloqueio se aplica ao inode, não ao nome do arquivo. Isso significa que um processo para mantê-lo aberto está acessando os mesmos dados (antigos), mesmo depois que o arquivo foi excluído (na verdade, desvinculado) e substituído por um novo com o mesmo nome, que é essencialmente o que faz uma atualização de pacote.
Essa é uma das principais diferenças entre o Unix e o Windows. O último não pode atualizar um arquivo bloqueado, pois está faltando uma camada entre os nomes de arquivo e os inodes, o que dificulta a atualização ou a instalação de alguns pacotes, pois geralmente requer uma reinicialização completa.
Os executáveis geralmente são abertos uma vez, anexados a um descritor de arquivo e não possuem um descritor de arquivo para o seu binário reaberto durante um único período de execução. Por exemplo, se você executar bash
, exec()
geralmente criará apenas um descritor de arquivo para o inode apontado pela /bin/bash
invocação única.
Isso geralmente significa que, para binários simples que não tentam se reler durante a execução (usando o caminho pelo qual foram chamados), o conteúdo armazenado em cache permanece válido como um inode pendente. Isso significa que existe essencialmente uma réplica da versão anterior do executável.
Em casos mais complexos, isso pode causar problemas. Por exemplo, um arquivo de configuração pode ser atualizado e subsequentemente relido, ou o programa pode ser reexecutado através do caminho em que foi executado. Também pode haver problemas se os programas estiverem interconectados e um for executado antes da atualização e um depois (possivelmente pelo primeiro programa). Isso também é verdade para algumas bibliotecas.
Para casos de uso simples, porém, é seguro atualizar sem reiniciar o processo.
bash
binário possui cerca de 200 páginas em 4K, não tendo certeza de que todas elas são usadas em uma sessão média.
ialloc()
uma estrutura do kernel na leitura, não o mapeamento de memória das próprias páginas. Não estou certo ao pensar que, nos modernos sistemas de arquivos ext *, o inode é eventualmente consistente no kernel (e dentro do subsistema VM)?