Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

<a href="/modules/moniwiki/wiki.php/manSearch?google=none&name=waitpid">waitpid</a>(2)

1장. waitpid(2)

차례
1.1절. 사용법
1.2절. 설명
1.3절. 반환값
1.4절. 에러
1.5절. 예제

프로세스의 종료를 기다린다.


1.1절. 사용법

#include <sys/types.h>
#include <sys/wait.h>
 
pid_t waitpid(pid_t pid, int *status, int options);
		


1.2절. 설명

waitpid 함수는 인수로 주어진 pid 번호의 자식프로세스가 종료되거나, 시그널 함수를 호출하는 신호가 전달될때까지 waitpid 호출한 영역에서 일시 중지 된다.

만일 pid 로 지정된 자식이 waitpid 함수 호출전에 이미 종료되었다면, 함수는 즉시 리턴하고 자식프로세스는 "좀비프로세스"로 남는다.

pid 값은 다음중 하나가 된다.

< -1

프로세서 그룹 ID가 pid 의 절대값과 같은 자식 프로세스를 기다린다.

-1

임의의 자식프로세스를 기다린다. 이것은 wait(2) 와 동일하다.

0

프로세스 그룹 ID가 호출 프로세스의 ID와 같은 자식프로세스를 기다린다.

> 0

프로세스 ID가 pid 의 값과 같은 자식 프로세스를 기다린다.

options 의 값은 0이거나 다음값들과의 OR 이다.

WNOHANG

이것은 어떤 자식도 종료되지 않았더라도, 즉시 리턴하란 뜻이다.

WNOHANG

멈추거나 상태가 보고되지 않은 자식들을 위해 리턴

status 는 프로세스의 상태를 가져오기 위해서 사용한다. status 가 NULL 이 아닐경우 status 가 가리키는 위치에 프로세스의 상태정보를 저장한다. 다음의 메크로들을 통해서 상태정보를 알아가져올수 있다.

WIFEXITED(status)

자식이 정상적으로 종료되었다면 non-zero 이다.

WEXITSTATUS(status)

exit()를 호출하기 위한 인자나 return 값이 설정되고 종료된 자식의 반환 코드의 최하위 8비트를 평가한다. 이 매크로는 정상정료 - WIFEXITED(status) - 일때만 평가된다.

WIFSIGNALED(status)

자식프로세스가 어떤 신호때문에 종료되었다면 참을 반환한다.

WTERMSIG(status)

자식프로세스를 종료하도록한 신호의 번호를 반환한다. 당연히 WIFSIGNALED 가 non_zero 일 경우에만 사용할수 있다.

WIFSTOPPED(status)

반환의 원인이 된 자식프로세스가 현재 정지되어 있다면 참을 반환한다.

WSTOPSIG(status)

자식을 정지하도록 야기한 신호의 숫자를 반환한다. WIFSTOPPED가 non-zero 일경우에만 사용할수 있다.


1.3절. 반환값

종료된 자식 프로세스의 ID는 에러일때 -1반환 하고, 만일 WNOHANG 가 사용되고 어떤 자식도 이용할수 없다면 0을 반환한다.


1.4절. 에러

ECHILD

pid 로 지정된 프로세스가 존재하지 않거나, 호출한 프로세스의 자식이 아닐경우

EINVAL

options 인자가 유효하지 않을경우

ERESTARTSYS

WNOHANG 가 설정되어 있지 않고 신호가 봉쇄되지 않았거나 SIGCHLD가 잡혔을때

ENOBUFS

시스템에 연산을 위해서 이용할수 있는 자원이 부족할때


1.5절. 예제

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
 
int main()
{
    int pid;
    int status;
 
    pid = fork();
 
    if (pid < 0)
    {
        perror("fork error : ");
        exit(0);
    }
    if (pid == 0)
    {
        printf("Im Child\n");
        sleep(10);
        return 2;
    }
    else
    {
        printf("Parent: wait (%d)\n", pid);
        waitpid(pid, &status, 0);
        if (WIFEXITED(status))
        {
            printf("정상종료\n");
            printf("리턴값 %d\n", WEXITSTATUS(status));
        }
        else if (WIFSIGNALED(status))
        {
            printf("신호받았음\n");
            printf("신호번호 %d\n", WTERMSIG(status));
        }
    }
    exit(0);
}
		
위 프로그램을 자식이 정상종료할때까지 기다리거나, 신호를 줘서 자식을 강제 종료시킨후의 결과값을 테스트 해보기 바란다.