[리눅스 시스템 프로그래밍] wait() 시스템 콜
자식 프로세스가 종료될 때 완전히 사라진다면, 부모 프로세스가 참고할 수 있는 정보들이 남지 않는다. 따라서 유닉스의 초기 설계자들은 자식 프로세스가 부모에 앞서 죽으면, 커널이 자식 프로세스를 특수한 프로세스 상태로 들어가게 만들어야 한다고 결정했다. 이런 상태에 있는 프로세스를 좀비라고 한다. 유용할지도 모르는 자료를 포함하는 몇 가지 기본적인 커널자료 구조처럼 프로세스를 지탱하는 최소 뼈대만 보존한다. 부모가 자신의 상태를 조사하도록 이런 특수한 프로세스 상태에 있는 자식 프로세스는 부모 프로세스를 기다린다(이런 자식 프로세스를 좀비 프로세스라고 부른다). 부모가 종료된 자식에 대해 보존된 정보를 획득한 다음에야 공식적으로 자식 프로세스가 종료되고 좀비에서 벗어나게 된다. 위의 프로세스 상태 전이 표에서 우측 상단에서 EXIT_ZOMBIE를 볼 수 있다. 리눅스 커널은 종료된 자식에 대한 정보를 얻기 위한 몇 가지 인터페이스를 제공한다. POSIX에 정의된 가장 단순한 인터페이스로 wait()가 있다. #include <sys/types.h> #include <sys/wait.h> pid_t wait (int *status); wait()를 호출하면 종료된 자식의 pid를 반환하며, 오류가 발생하면 -1을 반환한다. 자식 프로세스가 종료되지 않았다면 호출은 자식이 종료될 때까지 차단된다. 자식 프로세스가 이미 종료되었으면 호출은 즉시 반환된다. 따라서 SIGCHLD 를 받고나서 자식 프로세스가 사망했다는 소식을 접한 다음에 wait()를 호출할 경우 차단(blocking) 없이 즉시 반환된다. * SIGCHLD - 프로세스가 종료될 때 커널은 SIGCHLD 시그널을 부모에게 보낸다. 오류가 발생하면 다음 두 가지 errno 값 중 하나로 설정된다. ECHILD 호출한 프로세스에 자식 프로세스가 존재하지 않는다. EINTR 대기 중에 시그널을 받았으...