是否可以用 C 编写一个程序,该程序在执行时会删除自身(二进制文件)然后成功终止。如果是这样,最简单的方法是什么?
5 回答
是的。
#include <unistd.h>
int main(int argc, char* argv[])
{
return unlink(argv[0]);
}
(经过测试和工作。)
请注意,如果argv[0]
不指向二进制文件(由调用者重写),这将不起作用。同样,如果通过符号链接运行,则将删除符号链接,而不是二进制文件。
此外,如果文件有多个硬链接,则只会删除调用的链接。
我不知道是否可以以真正独立于平台的方式方便地做到这一点,但是您没有指定平台独立性,因此请尝试以下 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]);
}
这与您想要的有多接近?
如果您的操作系统允许正在运行的程序删除自己的二进制文件,则只需查找用于文件删除的 API,或执行相应的system()
命令。
如果操作系统不允许这样做,您的程序(我们称之为A)可以构建另一个二进制文件,其中包含另一个程序(我们称之为B)。然后,A会立即退出。
程序B将有一个循环检查A是否仍在运行,一旦A退出,B将擦除A的二进制文件。
您可以尝试仅删除程序中的可执行文件(FILE * 和其他内容)...但是看到该可执行文件是正在运行的,它可能无法正常工作。我看就像吃自己一样,据我所知这是不可能的,但是您当然可以使用我上面提到的方法尝试一下。
我认为这取决于您使用的平台。基本上,一旦加载了可执行文件,对二进制文件的任何后续更改都不会影响正在运行的程序。在 Unix 中就是这种情况,您可以使用 unlink 系统调用。
我不确定这在 Windows 上是否正确。可能不允许删除可执行映像。您可以在 Windows 中尝试 DeleteFile() api。