Двойная вилка
В моем понимании, двойная вилка используется, когда процесс хочет форкировать фоновый процесс, но 1. он не хочет ждать его И 2.фоновый процесс должен быть запущен после его выхода.
В результате двойная ветвь требует, чтобы родительский процесс ожидал только дочерний процесс, который должен завершиться сразу после разветвления процесса внука, а процесс внука отвечает за реальную задачу, посколькуфоновый процесс.
Context
Согласно этому отрывку из 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 = %ld\n", (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 секунды?Предположим, что он завершается до выхода дочернего процесса, он все равно будет получен при выходе из дочернего процесса в соответствии с этим вопросом , а родительский процесс по-прежнему не нуждается в этом.
Разве это не так?выполнить первоначальную цель использования двойной вилки?