wait, waitpid

programming/C_C++ 2017. 11. 3. 19:29
반응형

 

 

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;
}

 

 

반응형
Posted by 공간사랑
,