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

伊夫

众所周知,当我们执行一个可执行文件时,该文件将被加载到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 ++项目做同样的事情,并且在删除可执行文件后,它崩溃了。

为什么?哪种原因会导致飞机坠毁?

尤里·贡查鲁克(Yurij Goncharuk)

同意@ ctrl-alt-delor。

我继续。也许对某人会有帮助:

程序加载

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

来源:第三册:特定于操作系统(UNIX System V发行版4)

因此,程序不必完全加载到RAM中。


当某些文件在其他程序打开后被删除并映射后,在程序运行期间将始终可访问该文件。发生这种情况是因为rm仅删除了索引节点条目,但引用了映射的(map)内存的文件描述符将一直存在,直到对其进行编程unmapclose文件描述符为止因此,如果OS运行(exec)一些程序,则OS可能(更可能是)map可执行文件。最后,通过rm在执行程序时删除文件,不会执行缩进。


PS map或可执行文件段的完整副本的行为也取决于可执行文件的格式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

比较内存中正在运行的进程和磁盘中的可执行文件

为什么Git Bash无法运行我的可执行文件?

Windows在运行时删除make可执行文件。为什么?

GDB正在运行已删除的可执行文件

如何从正在运行的程序中创建可执行文件(或JAR)?

为什么32位可执行文件不能在WoW64下运行?

为什么我不能将此Maven构建为可执行文件

为什么CLion可以正确构建和链接Qt,但不能运行我的可执行文件?

PowerShell查找当前正在运行的主机的路径(PowerShell可执行文件)

XORing可执行文件时,为什么我的XOR程序不能在Windows上运行

在Windows上,为什么不能覆盖正在运行的应用程序的可执行文件?

午夜指挥官:用户正在运行命令或脚本/可执行文件

如何获取Linux中正在运行的进程的完整可执行文件名

如果我们可以在64位Windows上运行32位可执行文件,为什么不能将其转换?

查找*可执行文件位于当前正在运行的进程的位置

为什么在运行可执行文件时需要在前面添加./?

为什么我不能使用gcc生成“ Hello World”可执行文件?

如何知道正在运行的可执行文件的路径?

为什么当我尝试运行可执行文件时,该可执行文件会说它不存在?

覆盖正在运行的可执行文件或.so

正在运行的可执行文件:无此类文件或目录

为什么运行“错误”的可执行文件?

如何在Linux上列出可执行文件的所有正在运行的实例?

Qt5更改当前正在运行的可执行文件的软链接

如何确定您正在运行最新的可执行文件?

删除正在运行的可执行文件

如何恢复正在运行的进程被删除的二进制可执行文件

AIX:更改正在运行的程序的可执行文件

如何排除正在运行的可执行文件 C