为什么我们不能删除正在运行的可执行文件

为什么我们不能删除正在运行的可执行文件

众所周知,当我们执行一个可执行文件时,该文件会被加载到RAM中。

所以我想我可以rm a.exe之后./a.exe

在我看来,执行后./a.exe,该文件已加载到 RAM 中,因此我应该能够将其从硬盘驱动器中删除。我用一个例子做了一个简单的测试:

#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;
}

我编译了代码并执行了它,我可以看到hello world不断弹出。

然后我删除了可执行文件,但hello world仍然不断弹出。

所以我想我可以在可执行文件运行时删除它。

但今天我尝试对另一个 C++ 项目做同样的事情,在删除可执行文件后,它崩溃了。

为什么?什么样的原因会导致崩溃?

答案1

同意@ctrl-alt-delor。

我恢复它。也许这对某人会有帮助:

程序加载

当系统创建或扩充进程映像时,它会逻辑地将文件段复制到虚拟内存段。系统何时(以及是否)物理读取文件取决于程序的执行行为、系统负载等。

来源:第三册:操作系统特定(UNIX System V Release 4)

因此,程序没有必要完全加载到 RAM 中。


当其他程序打开并映射某个文件后删除某个文件时,该文件在程序运行时始终可以访问。发生这种情况是因为rm只需删除 inode 条目,但引用映射 ( map) 内存的文件描述符将一直存在,直到unmap对其和close文件描述符进行编程为止。因此,如果操作系统运行(exec)某个程序,那么操作系统可能(更有可能)map可执行文件。最后,通过rm程序执行时删除文件对其执行没有缩进。


聚苯乙烯 map或可执行文件段的整个副本行为也取决于可执行文件的格式。

相关内容