在双叉中,为什么孙子不能在孩子退出之前退出?

  • 本文关键字:退出 孩子 不能 unix fork
  • 更新时间 :
  • 英文 :


双叉

在我的理解中,当一个进程想要分叉一个后台进程时,会使用双分叉,但是1。它不想等待它AND 2。应该在后台进程退出后获取它。

因此,双分叉只需要父进程等待子进程,子进程应该在分叉孙进程后立即退出,而孙进程作为后台进程负责实际任务。

上下文

根据APUE的这段摘录,孙子睡了2秒,以确保它的父母(孩子(在它退出之前退出,这样它就会成为孤儿,init会照顾它,并在它退出时收获它。

#include "apue.h"
#include <sys/wait.h>
int
main(void)
{
pid_t   pid;
if ((pid = fork()) < 0) {
err_sys("fork error");
} else if (pid == 0) {      /* first child */
if ((pid = fork()) < 0)
err_sys("fork error");
else if (pid > 0)
exit(0);    /* parent from second fork == first child */
/*
* We're the second child; our parent becomes init as soon
* as our real parent calls exit() in the statement above.
* Here's where we'd continue executing, knowing that when
* we're done, init will reap our status.
*/
sleep(2);
printf("second child, parent pid = %ldn", (long)getppid());
exit(0);
}
if (waitpid(pid, NULL, 0) != pid)   /* wait for first child */
err_sys("waitpid error");
/*
* We're the parent (the original process); we continue executing,
* knowing that we're not the parent of the second child.
*/
exit(0);
}

问题

为什么孙子进程需要睡那2秒?假设它在子进程退出之前就退出了,根据这个问题,当子进程退出时,它仍然会被收获,而父进程仍然不需要照顾它

这难道不能实现使用双叉的最初目标吗?

示例的目的是演示孙的父级在其原始父级退出后成为进程1(init(。

为了证明孙的父进程成为进程1,孙调用getppid并打印结果。

  1. 如果孙子在其原始父级退出之前调用getppid,则getppid返回非pid 1的内容
  2. 如果孙在其原始父级退出后调用getppid,则getppid返回1

示例程序的目的是实现#2。因此,它需要确保在孙调用getppid之前,原始父级已经退出。它通过在孙中调用sleep(2)来实现这一点。

在一个真正的节目中,孙子不会在那里sleep(2)。它只会做它的工作。

由于这是一个玩具程序,孙子没有真正的工作要做。

最新更新