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