명령이 종료된 후 쉘이 명령의 하위 프로세스를 기다리지 않는 이유는 무엇입니까?

명령이 종료된 후 쉘이 명령의 하위 프로세스를 기다리지 않는 이유는 무엇입니까?

UNIX 프로세스에 대해 배우고 있지만 조금도 이해할 수 없습니다. 다음과 같은 코드가 있다고 가정해 보겠습니다.

void fork_child()
{
    if (fork() == 0) {
       /* Child */
       printf("Running Child, PID = %d\n",
           getpid());
       while (1)
           ; /* Infinite loop */
    } else {
       /* Parent */
       printf("Terminating Parent, PID = %d\n",
              getpid());
       exit(0);
    }
} 

부모 프로세스가 이전에 종료되었기 때문에 명시적으로 자식 프로세스를 종료한다는 것을 알고 있지만 코드를 실행할 때 쉘은 자식 프로세스의 while 루프를 기다리지 않고 백그라운드에서 실행되는 것과 비슷합니다. 이 문제의 주요 원인은 무엇입니까?

감사해요

답변1

wait()하위 프로세스가 종료될 때까지 차단하려면 상위 프로세스를 호출해야 합니다.

바라보다:http://man7.org/linux/man-pages/man2/waitpid.2.html

답변2

쉘 자체는 자신이 시작하는 프로세스의 자식에 대해 실제로 알지 못합니다. 예를 들어, 쉘은 프로세스 A를 시작한 다음 프로세스 B를 시작한 다음 A를 종료합니다. 이제 B는 계속 실행되지만 initPID 1의 자식이 됩니다. 쉘의 자식이 되지는 않습니다.

_exit(2)매뉴얼 페이지Linux에서(POSIX의 비슷한 표현):

이 프로세스의 모든 하위 프로세스는 에 상속됩니다 init(1). 이 프로세스의 상위 프로세스에 신호를 보냅니다 SIGCHLD.

SIGCHLD새로운 부모 프로세스가 자식 프로세스로부터 신호를 받고 wait()자식 프로세스를 호출하는 일을 담당해야 하기 때문에 조부모가 부모 없는 프로세스를 상속받도록 하는 것은 좋은 생각이 아닙니다 . 다른 프로그램을 실행하는 모든 프로그램은 여러 하위 프로세스를 처리할 수 있도록 준비해야 합니다.

물론 하위 프로세스가 셸이 계속 읽고 있는 파이프를 보유하고 있는 경우(예: 명령 대체) 셸은 기다려야 합니다. 파이프가 닫힐 때까지 모든 입력을 수신했다는 사실을 알 수 없기 때문입니다.

관련 정보