双叉
在我的理解中,当一个进程想要分叉一个后台进程时,会使用双分叉,但是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
并打印结果。
- 如果孙子在其原始父级退出之前调用
getppid
,则getppid
返回非pid 1的内容 - 如果孙在其原始父级退出后调用
getppid
,则getppid
返回1
示例程序的目的是实现#2。因此,它需要确保在孙调用getppid
之前,原始父级已经退出。它通过在孙中调用sleep(2)
来实现这一点。
在一个真正的节目中,孙子不会在那里sleep(2)
。它只会做它的工作。
由于这是一个玩具程序,孙子没有真正的工作要做。