众所周知,当我们执行一个可执行文件时,该文件将被加载到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 ++项目做同样的事情,并且在删除可执行文件后,它崩溃了。
为什么?哪种原因会导致飞机坠毁?
同意@ ctrl-alt-delor。
我继续。也许对某人会有帮助:
程序加载
当系统创建或扩展过程映像时,它将逻辑上将文件的段复制到虚拟内存段。系统何时(以及是否)以物理方式读取文件取决于程序的执行行为,系统负载等。
来源:第三册:特定于操作系统(UNIX System V发行版4)
因此,程序不必完全加载到RAM中。
当某些文件在其他程序打开后被删除并映射后,在程序运行期间将始终可访问该文件。发生这种情况是因为rm
仅删除了索引节点条目,但引用了映射的(map
)内存的文件描述符将一直存在,直到对其进行编程unmap
和close
文件描述符为止。因此,如果OS运行(exec
)一些程序,则OS可能(更可能是)map
可执行文件。最后,通过rm
在执行程序时删除文件,不会执行缩进。
PS map
或可执行文件段的完整副本的行为也取决于可执行文件的格式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句