为什么C程序可以删除自己然后运行另一个任务?

时间:2011-03-30 01:19:59

标签: c

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("remove %s\n", argv[0]);
    remove(argv[0]);

    printf("rename %s to %s\n", argv[1], argv[2]);
    rename(argv[1], argv[2]);
}


$g++ hello.cpp -o hello
$touch tmp
$./hello tmp temp
remove ./hello
rename tmp to temp

为什么可能?

2 个答案:

答案 0 :(得分:5)

至少在Unix中(包括Linux和Mac OS X),如果在某人打开文件时删除文件,我实际上并没有消失,直到打开它的程序关闭文件或终止。

答案 1 :(得分:2)

我想你不问怎么做(因为你证明了),但为什么可能呢?

答案是磁盘上的程序(文件)和内存中的程序之间存在差异。

当您运行程序时,通常会将其复制到RAM中并从那里运行,因为CPU只能直接访问RAM中的内容。此副本在概念上独立于磁盘上的文件,即使文件被删除,也可能保留在RAM中。

但是,如果某个操作系统代表正在运行的应用程序(如Windows),则某些操作系统不允许删除该文件。