/* wait, waitpid */
pid_t wait(int *stat); // 성공시 종료된 자식 프로세서의 ID를 반환하고 실패시 -1을 반환한다.
pid_t waitpid(pid_t pid, int *stat, int options); // 실패시 -1을 리턴하고 성공시에 0이나 혹은 종료된 자식 프로세서의 pid를 리턴한다.
// pid > 0일 경우 pid 값에 해당하는 프로세서ID값을 가진 자식 프로세서의 종료를 대기한다.
// pid = 0일 경우 프로세서 그룹ID가 호출 프로세서ID와 같은 자식 프로세서를 기다린다.
// pid = -1일 경우 임의의 자식 프로세서를 기다린다. wait와 같다.
// pid < -1일 경우 프로세서 그룹ID가 pid의 절대값과 같은 자식 프로세서의 종료를 기다린다.
pid = waitpid( -1, &status, WNOHANG );
/* wait 함수 호출 이후 상태 확인 */
#define WIFEXITED(stat) ((int)((stat)&0xFF) == 0) // 자식프로세서가 정상 종료한 경우 참을 반환한다.
#define WIFSIGNALED(stat) ((int)((stat)&0xFF) > 0 && (int)((stat)&0xFF00) == 0) // 자식프로세서가 비정상 종료한 경우 참을 반환한다.
#define WIFSTOPPED(stat) ((int)((stat)&0xFF) == 0177 && (int)((stat)&0xFF00) != 0) // 자식프로세서가 멈춰 있는 경우 참을 반환한다.
#define WEXITSTATUS(stat) ((int)(((stat)>>8)&0xFF)) // 자식프로세서의 전달값(프로세서에서 반환된 정수 or exit인자)을 반환한다. 단, 이값은 하위 8bit의 값만을 확인한다. 즉 0~255까지 확인가능한다.
#define WTERMSIG(stat) ((int)((stat)&0x7F)) // WIFSIGNALED 매크로가 참이라면 자식을 종료시킨 Signal번호를 확인한다.
#define WSTOPSIG(stat) ((int)(((stat)>>8)&0xFF)) // WIFSTOPPED 매크로가 참이라면 자식은 멈춘 상태로 만든 Signal번호를 확인한다.
/*arguments to wait functions options */
#define WUNTRACED 0004 /* wait for processes stopped by signals */ // 종료된 자식 프로세서가 종료되지 않아도 Blocking 상태가 되지 않고 0을 반환한다.
#define WNOHANG 0100 /* non blocking form of wait */ // 자식 프로세서가 멈춰있는지 확인해서 멈추었다면 그상태를 리턴한다.