Por que não podemos excluir um arquivo executável em execução [fechado]

2

Como sabemos, quando executamos um arquivo executável, esse arquivo será carregado na RAM.

Estou pensando que posso rm a.exe após ./a.exe .

Na minha opinião, depois de executar ./a.exe , este arquivo foi carregado na RAM, então eu devo poder removê-lo do disco rígido. Eu usei um exemplo para fazer um teste simples:

#include <iostream>
#include <thread>
#include <chrono>

int main()
{
        while (true)
        {
                std::cout<<"hello world"<<std::endl;
                std::this_thread::sleep_for(std::chrono::milliseconds(2000));
        }
        return 0;
}

Eu compilei o código e o executei, vejo que hello world continua aparecendo.

Em seguida, removo o arquivo executável e hello world continua aparecendo.

Então, acho que posso remover um arquivo executável enquanto ele está em execução.

Mas hoje eu tentei fazer a mesma coisa com outro projeto C ++, e depois de remover o arquivo executável, ele caiu.

Por quê? Que tipo de motivo pode causar o acidente?

    
por Yves 30.03.2018 / 10:57

1 resposta

1

Concordou com @ ctrl-alt-delor.

Eu continuo. Talvez seja útil para alguém:

Program Loading

As the system creates or augments a process image, it logically copies a file's segment to a virtual memory segment. When—and if— the system physically reads the file depends on the program's execution behavior, system load, and so on.

Fonte: Livro III: Sistema Operacional Específico (UNIX System V Release 4)

Portanto, o programa não é necessário totalmente carregado na RAM.

Quando algum arquivo será excluído depois que outro programa for aberto e depois mapeado, ele ficará acessível o tempo todo enquanto o programa estiver sendo executado. Isso acontece porque rm apenas remove a entrada do inode, mas o descritor de arquivo, que faz referência à memória mapeada ( map ), estará ativo até que o programa unmap it e close descritor de arquivo. Portanto, se o sistema operacional executar ( exec ) algum programa, o sistema operacional poderá (mais provavelmente) map arquivo executável. Finalmente, delete o arquivo através de rm quando o programa está sendo executado não tem nenhum recuo em execução.

P.S. map ou toda a cópia do comportamento dos segmentos de arquivos executáveis também depende do formato do arquivo executável.

    
por 30.03.2018 / 12:48

Tags