是否可以在C中编写自毁程序?

时间:2012-04-01 14:32:12

标签: c self-destruction

是否可以在C中编写一个程序,在执行时删除自身(二进制文件)然后成功终止。如果是这样,最简单的方法是什么?

5 个答案:

答案 0 :(得分:15)

#include <unistd.h>
int main(int argc, char* argv[])
{
  return unlink(argv[0]);
}

(经过测试和工作。)

注意如果argv[0]未指向二进制文件(由调用方重写),则无效。 同样,如果通过符号链接运行,则符号链接而不是二进制文件将被删除。

此外,如果文件有多个硬链接,则只会删除被叫链接。

答案 1 :(得分:5)

我不知道可以通过真正独立于平台的方式方便地进行,但是您没有指定平台独立性,因此请尝试以下Linux风格的代码:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv) {
    printf("Read carefully!  You cannot print this message again.\n");
    return unlink(argv[0]);
}

这与你想要的有多接近?

答案 2 :(得分:2)

如果操作系统允许正在运行的程序删除自己的二进制文件,那么只需查找用于删除文件的API,或执行相应的system()命令。

如果操作系统不允许这样做,你的程序(让我们称之为 A )可以构造另一个二进制文件,包含另一个程序(让我们称之为 B )。然后, A 会立即退出。

如果 A 仍在运行, A b>将擦除 A 的二进制文件。

答案 3 :(得分:0)

您可以尝试删除程序中的可执行文件(FILE *和stuff)...但是看到该可执行文件正在运行它可能不起作用。我觉得这就像在吃自己一样,据我所知,这是不可能的,但你肯定可以尝试使用我上面提到的方法。

答案 4 :(得分:0)

我认为这取决于您使用的平台。基本上,一旦加载了可执行文件,对二进制文件的任何后续更改都不会影响正在运行的程序。在Unix中,就是这种情况,您可以使用unlink系统调用。

我不确定这是否适用于Windows。可能不允许删除可执行映像。您可以在Windows中尝试DeleteFile()API。