부모프로세스는 자식 프로세스 종료에 대해 정보를 얻고 싶다. (왜 죽었나, 에러가 있었나 등등..) 그래서 자식이 종료될 때 좀비로 만들어 부모 프로세스가 자식의 상태를 체크할 수 있도록 해준다. 소위 waiting on zombie process라고한다. 종료된 자식 프로세스를 기다려 상태를 얻어오는 함수가 wait()인데 아래같이 생겼다.
이 함수를 실행하면 자식이 죽을 때까지 블럭 된다. 종료될 때 받은 status값을 아래 매크로?함수?를 통해 상태를 파악할 수 있다.
모든 프로세스에 대하여 생사여부(?)를 기다리는 wait외에도 특정 pid에 대해 wait 할 수 있는데, 이게 waitpid()이다.
pid에 체크할 프로세스 번호 외에 음수 즉 -500같은 값을 넣으면 프로세스 그룹 아이디가 500인 것들에 대해 기다리고, -1은 모든 자식에 대해(wait()과 같다) 기다린다. 0인 경우는 자신과 같은 프로세스 그룹에 대해 기다린다. options에는 WNOHANG을 줘서 nonblock으로 실행할 수 있다.
이외에도 더좀 더 다향한 방법으로 사용할 수 있는 함수로 waitid()가 있다.
#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()가 있다.