众所周知,当我们执行一个可执行文件时,该文件会被加载到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
或可执行文件段的整个副本行为也取决于可执行文件的格式。