Public/tip & tech

Wait Child process termination & Zombi process

quantapia 2008. 6. 24. 10:28
부모프로세스는 자식 프로세스 종료에 대해 정보를 얻고 싶다. (왜 죽었나, 에러가 있었나 등등..) 그래서 자식이 종료될 때 좀비로 만들어 부모 프로세스가 자식의 상태를 체크할 수 있도록 해준다. 소위 waiting on zombie process라고한다. 종료된 자식 프로세스를 기다려 상태를 얻어오는 함수가 wait()인데 아래같이 생겼다.

#include <sys/types.h>
#include <sys/wait.h>
pit_t wait(int *status);

이 함수를 실행하면 자식이 죽을 때까지 블럭 된다. 종료될 때 받은 status값을 아래 매크로?함수?를 통해 상태를 파악할 수 있다.

  • int WIFEXITED(status) : 정상 종료인지
  • int WEXITSTATUS(status) : 종료시 상태값 (0, 에러...)
  • int WIFSIGNALED(status) : 시그널 받았는 지
  • int WTERMSIG(status) : 그 때의 시그널 값
  • int WIFSTOPPED(status) : ... 주로 디버깅 때 사용
  • int WSTOPSIG(status) : 프로세스를 멈춘 시그널
  • int WIFCONTINUED(status) : ... 주로 디버깅 때 사용
  • int WCOREDUMP(status) : 코어 생겼는지.

모든 프로세스에 대하여 생사여부(?)를 기다리는 wait외에도 특정 pid에 대해 wait 할 수 있는데, 이게 waitpid()이다.

#include <sys/types.h>
#include <sys/wait.h>

pid_t waitpid(pid_t pid, int *status, int options);

pid에 체크할 프로세스 번호 외에 음수 즉 -500같은 값을 넣으면 프로세스 그룹 아이디가 500인 것들에 대해 기다리고, -1은 모든 자식에 대해(wait()과 같다) 기다린다. 0인 경우는 자신과 같은 프로세스 그룹에 대해 기다린다. options에는 WNOHANG을 줘서 nonblock으로 실행할 수 있다.

이외에도 더좀 더 다향한 방법으로 사용할 수 있는 함수로 waitid()가 있다.