11

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

4

5 回答 5

15

是的。

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

(经过测试和工作。)

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

此外,如果文件有多个硬链接,则只会删除调用的链接。

于 2012-04-01T14:35:06.360 回答
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]);
}

这与您想要的有多接近?

于 2012-04-01T14:41:26.720 回答
2

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

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

程序B将有一个循环检查A是否仍在运行,一旦A退出,B将擦除A的二进制文件。

于 2012-04-01T14:37:59.093 回答
0

您可以尝试仅删除程序中的可执行文件(FILE * 和其他内容)...但是看到该可执行文件是正在运行的,它可能无法正常工作。我看就像吃自己一样,据我所知这是不可能的,但是您当然可以使用我上面提到的方法尝试一下。

于 2012-04-01T14:36:28.037 回答
0

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

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

于 2012-04-01T14:37:51.750 回答