有人可以建议我一个简单的方法来创建一个无法在几分钟内收获的僵尸进程。 这样做的目的是测试父进程是否能够在僵尸进程再次恢复后获得它们。
可以找到一个不可靠的僵尸案例here。我想可能有更简单的方法。
操作系统:Linux
优选语言:C / C ++
答案 0 :(得分:0)
这是一个小程序,会让僵尸出现在你的" ps aux"输出几分钟。注意注释掉的waitpid()调用;如果您取消对该呼叫的评论,则僵尸将不会显示,因为waitpid()调用会导致父进程声明其死亡的孩子。
(免责声明:我只在MacOS / X下进行了测试,因为那是我所使用的计算机,但在Linux下应该可以正常运行)
#include <stdio.h>
#include <signal.h>
#include <pthread.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
printf("Starting Program!\n");
int pid = fork();
if (pid == 0)
{
printf("Child process %i is running!\n", getpid());
sleep(300); // wait 5 minutes
printf("Child process %i is exiting!\n", getpid());
return 0;
}
else if (pid > 0)
{
printf("Parent process is continuing child's pid is %i...\n", pid);
sleep(5); // just for clarity
printf("Parent process is sending SIGKILL to child process...\n");
if (kill(pid, SIGKILL) != 0) perror("kill");
// waitpid(pid, NULL, 0); // uncomment this to avoid zombie child process
printf("Parent process is sleeping... ps aux should show process #%i is a zombie now\n", pid);
sleep(500); // just for clarity
printf("Parent process is exiting!\n");
}
else perror("fork()");
}
答案 1 :(得分:0)
让我们从显而易见的事情开始——生命过程是无法收获的。保持流程活跃,仅此而已。
类似地,您可以将该进程嵌套在一个拒绝终止的容器进程中,并且由于该容器进程是新的父进程,并且它不会进行任何收割,也不会放弃对其子进程的控制,因此没有人可以收割子进程(好吧……无论如何都是“孙子”)。
如果您希望操作系统避免收割您的进程,那么您可能会在 macOS 上走运(在 Big Sur 上测试)。如果子进程被强制终止,并且其父进程也被强制终止,MacOS 将忘记收割子进程,而从未收割过子进程。
进程将显示为 ps aux
,但系统似乎永远不会收割崩溃的子进程,并且资源似乎仍在使用中(使用过的文件、打开的套接字、内存等)。
所以基本上你可以接受@jeremy-friesner 提供的答案并将其嵌套在一个流程中,你就完成了。
如果这些不是任何想要的效果,那么我可能误解了这个问题。