如何杀死僵尸进程并保持其父进程存活?

如何杀死僵尸进程并保持其父进程存活?

我在.net 核心框架中进行打印。

每次打印标签时,我都会启动一个进程。因此,打印 100 个标签时,就会创建 100 个僵尸进程。

仅当我停止创建打印进程的父应用程序时,僵尸进程才会从进程表中删除。

但我不能每次都停止应用程序,因为这会影响其他功能。

如何在不终止父应用程序的情况下终止僵尸进程?Ubuntu 可以处理多少个僵尸进程?

我尝试了链接中给出的所有方法:有没有什么办法可以杀死僵尸进程而无需重启? 但都不起作用。

我无法终止父进程。

答案1

您无法创建僵尸进程。当您派生一个进程并且此派生进程(子进程)结束时,它会发送返回代码。如果父进程没有等待此返回代码,则子进程将成为僵尸进程(子进程死亡而父进程不知道)。

在 C 语言中,它将是父进程中的 wait() 函数,读取返回值。

常见的解决方法(如果您不想在父进程中等待子进程的返回代码)是双重分叉。这意味着,您的主进程 A 将创建新的进程 B,该进程将启动进程 C。进程 B 立即结束,进程 A 可以在启动后立即收到其返回代码。进程 C 将执行任何需要的操作(在您的情况下是打印标签),并在结束时发送返回代码。它的父进程 B 已经死亡,因此系统将处理它(过去是 pid 为 1 的进程,不确定现在如何工作)。而且它不会变成僵尸。

编辑:这是我在以下位置找到的一个例子https://stackoverflow.com/questions/10932592/why-fork-twice 第一个 if 序列是进程 A 在 fork 之后,它将等待其子进程 B 完成。

int main()
{
pid_t p1 = fork();

if (p1 != 0)
{
    printf("p1 process id is %d", getpid());
    wait();
    system("ps");
}
else
{
    pid_t p2 = fork();
    int pid = getpid();

    if (p2 != 0) 
    {
        printf("p2 process id is %d", pid);
    }
    else
    {
        printf("p3 process id is %d", pid);
    }

    exit(0);
}
}

相关内容