상위 프로세스가 하위 프로세스를 생성하고 하위 프로세스가 완료되기 전에 종료한 다음 고아 프로세스를 다시 상위 프로세스로 초기화하도록 하려면 어떻게 해야 합니까?

상위 프로세스가 하위 프로세스를 생성하고 하위 프로세스가 완료되기 전에 종료한 다음 고아 프로세스를 다시 상위 프로세스로 초기화하도록 하려면 어떻게 해야 합니까?
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int main ()
{
  pid_t child_pid;

  child_pid = fork ();
  // parent process
  if (child_pid > 0) {
    printf("\n(parent): Parent's PID : %d\n",getpid());
    fflush(stdout);
    sleep (10);
    printf("\n(parent): Parent exits\n");
    fflush(stdout);
    /*int returnStatus;
    waitpid(child_pid, &returnStatus, 0);
    if (returnStatus == 0)  // Verify child process is terminated.
    {
       printf("The child process terminated normally.");
                         sleep(10);
    }*/
  }
  // child process
  else {
    printf("\n(child): Child's PID : %d\n",getpid());
    printf("\n(child): Child's Parent ID : %d\n",getppid());
    printf("\n(child): Child exits and becomes and zombie while parent 
sleeps.\n");
    fflush(stdout);
    exit (0);
  }
  return 0;
}

이것이 제가 지금까지 Unix에서 Vim을 사용하여 얻은 결과입니다. 부모가 자식을 생성할 때 자식이 완료되기 전에 종료되고 자식이 완료되면 고아가 되어 다시 부모가 되어 자식이 종료되도록 이 부분을 수정하려면 어떻게 해야 합니까?

나는 sleep(value)이러한 과정을 지연시켜야 한다는 것을 알고 있지만, 원래 부모가 사라진 후에 고아들이 다시 부모가 될 수 있도록 내가 지연하고 있는 것이 무엇인지 확신이 없고 혼란스럽습니다.

답변1

sleep시스템 사용량이 많거나 불필요하게 긴 지연이 필요할 경우 제대로 작동하지 않을 수 있습니다. 더 나은 접근 방식은 부모와 자식 간에 통신하여 부모가 응답할 때까지 또는 이 경우 사라질 때까지 자식이 차단하도록 하는 것입니다. 이는 read상위 프로세스(나중에...)가 종료될 때까지 차단하는 하위 프로세스의 파이프 및 차단을 통해 수행할 수 있습니다 .

#include <err.h>
#include <errno.h>
#include <unistd.h>

int main(void)
{
    char ch;
    int fd[2];
    pid_t pid;
    ssize_t ret;

    pipe(fd);

    pid = fork();
    if (pid < 0) {
        err(1, "fork failed");
    } else if (pid == 0) { /* child */
        close(fd[1]);
        warnx("child  %d start", getpid());
        // block until parent goes away
        ret = read(fd[0], &ch, 1);
        warnx("child  %d parent gone", getpid());
    } else { /* parent */
        // simulate system being slow
        sleep(3);
    }
    return 0;
}

관련 정보