Wait
wait()함수는 부모에서 자식이 원하는 작업을 수행했는지 확인하는 함수이다. wait함수를 실행하면 부모 프로세스가 멈춘다. 부모 프로세스는 자식의 상태가 변경이 되거나(일반적으로는 자식 프로세스가 종료), 보낸 신호(caller)가 되돌아오면 다시 실행한다.
- 자식 프로세스가 종료될 때 까지 기다릴 수 있다.
- 자식 프로세스의 상태 정보를 넘겨 받을 수 있다.
- 자식 프로세스가 작업 종료 후 return하는 정보를 넘겨 받을 수 있다.
wait과 waitpid
- wait을 사용하려면 #include <sys/wait.h> 헤더파일을 넣어야 한다.
- pid_t wait(int *stat_loc);
- wait은 PID를 넘겨준다.
- 또한 상태정보를 넘겨 줄 수 있다.(stat_loc)
- signal을 받아서 종료되었다면 무슨 signal을 받아서 종료되었는지 알려줄 수 있다.
- -1은 에러
waitpid
- pid_t waitpid(pid_t pid, int *stat_loc, int options);
- wait()는 자식을 지정할 수 없지만, waitpid는 자식을 지정할 수 있다.
- waitpid는 더 많은 기능이 있으며 많이 쓰인다.
- 특정한 자식이 종료될 때 까지 기다릴 수 있다.
- 옵션을 통해 충돌이 일어나지 않게 할 수 있다.(WNOHANG)
- WNOHANG은 자식 프로세스가 끝났는지를 한번 확인한다. 종료되었다면 PID를 return하고 종료가 안 되었다면 0을 return한다.
- 종료된 자식에 대한 정보를 얻을 수 있다.
stat_loc
- stat_loc은 wait이나 waitpid에서 상태값을 받아올 수 있는 int형 포인터 변수이다.
- stat_loc은 NULL이 아니며, 자식 프로세스의 상태를 받아서 반환해준다.
- 자식 프로세스는 exit,_exit,_Exit 아니면 return을 통해서 부모에게 상태를 전달한다.
- POSIX에서 설정되어 있는 6개의 매크로를 통해 상태를 점검할 수 있다.
- WIFEXITED(int stat_val) : 0이 아니면 자식이 정상적으로 종료했음을 알림
- WEXITSTATUS(int stat_val) : 0이 아니면 자식의 return값을 8bit값을 통해 얻을 수 있음
- WIFSIGNALED(int stat_val) : 0이 아니면 시그널에 의해서 종료했음을 알림
- WTERMSIG(int stat_val) : 0이 아니면 몇번 시그널에 의해서 종료했는지를 알림
- WIFSTOPPED(int stat_val) : 0이 아니면 자식이 멈춤(stop)을 알림.
- WSTOPSIG(int stat_val) : 0이 아니면 몇번 시그멀에 의해서 자식이 멈췄는지 알림
