是否可能编写一个 C 程序,在执行后删除自己(二进制文件),并成功终止程序?如果可以,最简单的方法是什么?
是否可能编写一个 C 程序,在执行后删除自己(二进制文件),并成功终止程序?如果可以,最简单的方法是什么?
#include <unistd.h>
int main(int argc, char* argv[])
{
return unlink(argv[0]);
}
(已经测试并且有效。)
请注意,如果argv [0]
不指向二进制文件(由调用者重写),这将无法正常工作。同样,如果通过符号链接运行,则将删除符号链接而不是二进制文件。
此外,如果该文件具有多个硬链接,则只会删除调用的链接。
argv[0]
作为二进制文件路径的可靠性。POSIX规定它应该指向二进制文件,但不强制要求,并且API允许程序将其设置为其他内容。最终结果是,这通常有效,但不可靠。此外,即使您有正确的路径,该二进制文件可能会在多个位置上进行硬链接。 - dmckee --- ex-moderator kitten我不知道是否有一种真正独立于平台的便捷方式,但是您没有指定平台独立性,因此可以尝试以下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]);
}
main
参数。顺便说一下,这只会使得你的示例代码更难让新手理解... - Oliver Charlesworthint argc
之前加上__attribute__((unused))
,我的GCC 4.4编译器(如果使用了-Wall
和-Wextra
开关)会发出警告。原因当然是因为argc
在这里未被使用。] - thbT **
不能转换为const T **
,因此最好不要混淆两者。 - Oliver Charlesworthsystem()
命令即可。我认为这取决于您使用的平台。基本上,一旦可执行文件被加载,对二进制文件的任何后续更改都不会影响正在运行的程序。在Unix中,情况是如此的,并且您可以使用unlink系统调用。
我不确定Windows是否也是如此。可能不允许删除可执行映像。您可以尝试在Windows中使用DeleteFile() API。