반응형
waitpid(pid_t pid, int *stat_loc, int options);
(linux manpage 를 번역 및 해석한 글입니다.)
<개요>
waitpid 함수는 wait 함수처럼 자식 프로세스를 기다릴 때 사용하는 함수이다. 즉 자식 프로세스의 종료상태를 회수할 때 사용한다. 하지만 waitpid 함수는, 자식 프로세스가 종료될 때까지 계속 기다리는 것이 아니라 세번째 인자인 옵션을 이용해서 원할 때 종료할 수 있다.
<헤더>
#include <sys/wait.h>
<인자들 분석>
pid : wait하고 싶은 child process를 pid 값으로 정할 수 있다. pid 값이 -1이면, 아무 자식 프로세스를 기다린다.
stat_loc : status를 저장하고 싶은 변수의 주소를 인자로 넘긴다. (널도 넘길 수 있다.)
- 종류가 매우 많다.
- child process 의 정보를 리턴하거나, true/false 형태의 정보를 리턴하는 것으로 구분할 수 있다.
- true or false 리턴하는 종류
- WIFEXITED : _exit(2), exit(3)으로 인해 프로세스가 종료되었을 때 참.
- WIFSIGNALED : 시그널을 받아서 프로세스가 종료되었을 때 참.
- WIFSTOPPED: 프로세스가 종료되지는 않았고 중단되었으며 다시 시작할 수 있을 때 참. 단, WUNTRACED옵션이 켜져있고 자식 프로세스가 추적되고 있을 때 참이 될 수 있다. (ptrace(2) 참고)
- child process의 정보를 리턴하는 종류
- WEXITSTATUS : WIFEXITED가 참이었다면, _exit(2) or exit(3)에 전달된 인자의 최하위 8비트를 검사한다.
- WTERMSIG : WIFSIGNALED가 참이면, 프로세스의 종료를 일으킨 시그널의 개수를 검사한다.
- WCOREDUMP : WIFSIGNALED가 참이면, 프로세스의 종료가 (시그널을 받은 시점에서 process의 이미지를 갖고 있는 core file의 생성)과 함께 이루어졌는지 검사한다.
- WSTOPSIG: WIFSTOPPED가 참이면, 프로세스를 중단시킨 시그널의 개수를 검사한다.
options :
- WNOHANG option이 되어있다면, 기다리는 PID가 종료되지 않아서 즉시 종료 상태를 회수할 수 없는 상황에서 호출자는 block되지 않고 반환값으로 0을 받는다.
- WUNTRACED가 되어있다면, (SIGTTIN, SIGTTOU, SIGSTP 중단된 자식 프로세스의 상태를 반환받는다.
- WCONTINUED : 중단되었다가, 다시 시작한 자식 프로세스의 상태를 받는다.
<반환 값>
자식 프로세스가 종료되거나 멈추어서 리턴하게 될 때는, 그 자식 프로세스의 process ID 가 반환받는다.
기다릴 자식이 없으면, -1이 리턴되고, errno는 ECHILD로 세트된다.
그렇지 않으면, WNOHANG이 옵션으로 명시되었고 멈추었거나 exit된 자식 프로세들이 하나도 없다면 0이 반환된다.
에러가 생겼거나 이 함수의 호출을 caught signal이 중단시켰다면, -1이 반환되고 errno가 그 에러에 맞게 세트된다.
반응형