我不确定为什么我们需要在父进程中调用 wait() 来处理僵尸进程,而双叉应该处理它?如果仅 wait() 已经可以完成这项工作,为什么我们需要双叉?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
// fork first time
pid = fork();
if (pid == 0)
{
// double fork
pid = fork();
if (pid == 0)
{
printf("Grandchild pid : %d\n Child"
" pid : %d\n",
getpid(), getppid());
}
else
{
exit(0);
}
}
else
{
wait(NULL);
sleep(10);
}
}
我不确定为什么我们需要在父进程中调用 wait() 来处理僵尸进程,而双叉应该处理它?如果仅 wait() 已经可以完成这项工作,为什么我们需要双叉?
您误解了双重fork
成语的目的和用法。
除了 pid 1 之外的每个进程在终止时都会变成僵尸。僵尸一直存在于进程表中,直到它通过wait
-family 函数之一被收集。如果进程的父进程还活着,那么那是必须wait
收集它的进程。否则,责任将转移到进程 1。作为进程 1 运行的程序的可行选择将非常有效地处理这些,因此您几乎永远不会看到正在等待进程 1 收集它们的僵尸。
fork
_双倍fork
的目的是让原始进程A创建一个进程,该进程将由进程 1 负责清理,尽管A继续运行。如果你愿意的话,火灾并忘记它的情况。这是通过ing立即成为所需进程Cfork
的子B来完成的。然后进程B终止以将C的责任转移给进程 1(而不是进程A)。fork
这并不能免除进程Await
对进程B的责任。但是A可以wait
立即执行该操作并且知道它不会延迟很长时间,而不是阻塞直到C终止,或者必须定期检查C的完成情况,或者无限期地让C成为僵尸,这将是如果A fork
ed C直接的替代方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句