wait, waitpid
이름
wait, waitpid - 프로세스 종료를 기다린다.
사용법
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status)
pid_t waitpid(pid_t pid, int *status, int options);
설명
wait 함수는 자식이 종료될 때까지, 또는 현재 프로세스를 종료시키거나 시그널 처리함수를 호출하는 행동을 하는 신호
가 전달될 때까지 현재 프로세스의 실행을일시 중지시킨다. 만일 자식이 호출 시간에 이미 종료되었다면(좀비 프로 세
스), 함수는 즉시 리턴한다. 자식이 사용한 시스템 자원들은 모두 풀어진다.
waitpid 함수는 pid 인자가 가리키는 자식이 종료될 때 까지, 또는 현재 프로세스를 종료시키거나 시그널처리 함수를
호출하는 행동을 하는 신호가 전달될때까지 현재 프로세스의 실행을일시 중지시킨다.
만일 pid 로 지정된 자식이 호출 시간에 이미 종료되었다면(좀비 프로세스), 함수는 즉시리턴한다.
자식이 사용한 시스템 자원들은 모두 풀어진다.
pid 값은 다음 중 하나이다:
< -1 이것은 프로세세 그룹 ID가 pid의절대 값과 같은 어떤 자식 프로세스를 기다리라는 의미이다.
-1 이것은 어떤 자식 프로세스를 기다리라는 의미이다; 이것은 wait 에서 나타난 것과 같은 행동을 한다.
0 이것은 프로세스 그룹 ID가 호출 프로세스의 ID와 같은 어떤 자식 프로세스를기다리라는 의미이다.
> 0 이것은 프로세스 ID가 pid의값과 같은 자식을 기다리라는 의미이다.
options 의 값은 0 이거나 다음 상수의 어떤것과 OR 이다.
WNOHANG
이것은 어떤 자식도 종료되지 않았다면 즉시 리턴하라는 의미이다.
WUNTRACED
이것은 멈추거나 상태가 보고되지 않은 자식들을 위해 역시 리턴하라는 의미이다.
만일 status 가 NULL이아니라면 wait 또는 waitpid 는 status가가리키는 위치에 상태 정보를 저장한다.
이 상태는 다음 매크로들로 평가된다.(이들 매크로는 인자로써 stat 버퍼 (int)를 가지고 있다. -- 버퍼에 대한 포인터가 아니다!)
WIFEXITED(status)
자식이 정상적으로 종료되었다면 non-zero 이다.
WEXITSTATUS(status)
exit() 를 호출하기 위한 인자나 주 프로그램에서 return 문장을 위한 인자로써 설정되고 종료된 자식의 반 환
코드의 최하위 8비트를평가한다. 이 매크로는 WIFEXITED 가 non-zero 를 반환할 때만 평가된다.
WIFSIGNALED(status)
만일 자식 프로세스가 잡혀지지 않은 신호때문에 종료되었다면 참을 반환한다.
WTERMSIG(status)
자 식 프로세스를 종료하도록 야기한 신호의 숫자를 반환한다. 이 매크로는 만일 WIFSIGNALED 가 non-zero 를
반환할 경우만 평가된다.
WIFSTOPPED(status)
반환의 원인이 된 자식 프로세스가 현재 정지되어 있다면 참을 반환한다.; 이것은 이 함수가 WUNTRACED를사용했
을 때만 가능하다.
WSTOPSIG(status)
자식을 정지하도록 야기한 신호의 숫자를 반환한다. 이 매크로는 WIFSTOPPED 가 non-zero 를 반환할 경우만 평
가된다.
반환값
종료된 자식의 프로세스 ID는 에러일때 -1 이거나 만일 WNOHANG 이 사용되고 어떤 자식도 이용할 수 없다면 0을 반환한
다. (각각의 경우, errno 는 적당한 값으로 설정된다.)
에러
ECHILD 만 일 pid 로 지정된 프로세스가 존재하지 않거나 호출 프로세스의 자식이 아닐 경우이다. (이것은 SIGCHLD 에
대한 행동이 SIG_IGN 으로 설정되었다면 자신의자식을 위해 일어날 수 있다.)
EINVAL options 인자가 유효하지 않을 경우이다.
ERESTARTSYS
만일 WNOHANG 가 설정되지 않고 신호가 봉쇄되지 않았거나 SIGCHLD 가 잡혔을 때이다. 이 에러는 시스템 콜에서
반환된다. 라이브러리 인터페이스는 ERESTARTSYS를반환할 때 허용되지 않는다. 그러나 EINTR는반환된다.
주의
단일 유닉스 명세서는 SA_NOCLDWAIT 플래그가 설정되어 있거나 SIGCHLD에 대한행동이 SIG_IGN(그러나 POSIX에서는 허용
되지 않는다.)로 설정되어 있을 경우에이 플래그(리눅스에서는 존재하지 않는다)를 기술한다. 그리고 종료된 자식들은
좀 비 가 되 지 않으며 wait() 또는 waitpid() 함수의 호출은 모든 자식들이 종료될 때까지 봉쇄될 것이며 errno 를
ECHILD으로 설정하고 실패한다.
예)
----------------------------------------
pid_t nChildPid = -1;
int nStatus = 0;
waitpid(nChildPid, &nStatus, 0);
----------------------------------------
void pr_exit(int status)
{
if( WIFEXITED(status) ) {
fprintf(stdout, "normal termination, exit status=%d\n", WEXITSTATUS(status) );
}
else if( WIFSIGNALED(status) ) {
fprintf(stdout, "abnormal termination, signal number=%d\n", WTERMSIG(status) );
}
else if( WIFSTOPPED(status) ) {
fprintf(stdout, "child stopped, signal number=%d\n", WSTOPSIG(status) );
}
return;
}