WAIT(2)

명칭
wait, waitpid, wait4, wait3 - 프로세스의 종료 대기

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/wait.h> pid_t wait(int *status) <sys/time.h> <sys/resource.h> pid_t waitpid(pid_t wpid, int *status, int options) pid_t wait3(int *status, int options, struct rusage *rusage) pid_t wait4(pid_t wpid, int *status, int options, struct rusage *rusage)

해설
wait() 함수는, 종료한 child process의 status 정보를 사용할 수 있게 될 때까지, 또는 시그널을 수신할 때까지, 소환 프로세스의 실행을 정지합니다. wait() 소환이 성공하면(자), status area에는 아래의 정의와 같이 종료한 프로세스의 종료 정보가 들어갑니다.

wait4() 소환은, 특정의 child process를 기다릴 필요가 있어, child process가 축적한 리소스 이용 통계 혹은 옵션을 필요로 하는 프로그램을 위해서(때문에), 보다 일반적인 인터페이스를 제공합니다. 그 외의 대기 함수는, wait4() (을)를 사용해 실장되고 있습니다.

wpid 파라미터는 기다려야 할 child process의 집합을 지정합니다. wpid 하지만 -1 인 경우, 이 소환은 모든 child process를 기다립니다. wpid 하지만 0 인 경우, 이 소환은, 소환측의 프로세스 그룹의 모든 child process를 기다립니다. wpid 하지만 0 보다 큰 경우, 이 소환은 프로세스 ID 가 wpid 인 프로세스를 기다립니다. wpid 하지만 -1 보다 작은 경우, 소환은, 프로세스 그룹 ID 가 wpid 의 절대치에 동일한 프로세스를 기다립니다.

status 파라미터는, 이하와 같이 정의되고 있습니다. options 파라미터에는, 이하의 임의의 옵션의 비트 논리합이 들어갑니다. WNOHANG 옵션은, 스테이터스를 보고하는 프로세스가 없는 경우에 소환이 블록 하지 않는 것을 나타내기 위해서(때문에) 사용합니다. WUNTRACED 옵션을 설정하면(자), SIGTTIN 시그널, SIGTTOU 시그널, SIGTSTP 시그널, SIGSTOP 시그널을 위해서(때문에) 정지한 경향 프로세스의 아이에게도, 그 스테이터스를 보고시킵니다. rusage 하지만 0 이외인 경우는, 종료한 프로세스와 그 모든 아이가 사용한 리소스의 요약이 돌려주어집니다 (현재로서는, 이 정보는 정지한 프로세스에 대해서는 사용할 수 없습니다). WNOHANG 옵션을 지정이 지정되어 스테이터스를 보고하는 프로세스가 없는 경우, wait4() (은)는 프로세스 ID 0 을 되돌립니다.

waitpid() 소환은, rusage 의 값을 0 으로 했다 wait4() (와)과 같습니다. 낡다 wait3() 소환은, wpid 의 값을 -1 로 했다 wait4() (와)과 같습니다.

이하의 매크로는, 프로세스의 종료의 방법을 아는데 사용할 수 있습니다. 최초의 3 개의 매크로는, 0 이외 (진)의 값을 평가합니다.

WIFEXITED(status)
    _exit(2) 인가 exit(3) (을)를 소환, 프로세스가 정상적으로 종료했을 경우에 진이 됩니다.

WIFSIGNALED(status)
    시그널을 수신했기 때문에 프로세스가 종료했을 경우에 진이 됩니다.

WIFSTOPPED(status)
    프로세스가 종료하고 있지 않지만, 정지하고 있어 재개할 수 있는 경우에 진과 됩니다. 이 매크로는 wait() 소환으로 WUNTRACED 옵션을 지정하는지, child process가 트레이스 되고 있다 ( ptrace(2) (을)를 참조) 경우에만 진이 됩니다.

상기 매크로의 값에 따라, 이하의 매크로는, child process의 나머지의 스테이터스 정보를 생성합니다.

WEXITSTATUS(status)
    WIFEXITED(status) 하지만 진인 경우에, 아이가 _exit(2) 인가 exit(3) 에 건네준 인수의 하위 8 비트를 평가합니다.

WTERMSIG(status)
    WIFSIGNALED(status) 하지만 진인 경우에, 프로세스의 종료의 원인이 된 시그널의 번호를 평가합니다.

WCOREDUMP(status)
    WIFSIGNALED(status) 하지만 진인 경우에, 프로세스가 종료한 다음에, 시그널을 수신했을 때의 프로세스의 이미지를 포함한 코어 파일이 작성되었을 경우에 진이 됩니다.

WSTOPSIG(status)
    WIFSTOPPED(status) 하지만 진인 경우에, 프로세스의 정지의 원인이 된 시그널의 번호를 평가합니다.

주
종료 시그널의 리스트에 대해서는, sigaction(2) (을)를 참조해 주세요. 스테이터스가 0 이다고 하는 것은, 정상적으로 종료했다고 하는 것입니다.

모든 child process의 종료를 기다리지 않고 parent process가 종료하면(자), 나머지의 child process에는 parent process 1 ID (init 의 프로세스 ID)를 할당할 수 있습니다.

임의의 wait() 소환이 보류가 되어 있는 동안에 시그널을 수신하면(자), 시그널 수신 routine가 돌아왔을 때에, 소환은 끼어들어질까 재개됩니다. 이것은 시그널에 영향을 주는 옵션에 의존합니다. intro(2) 시스템 콜의 재개 (System call restart)의 항목을 참조해 주세요.

반환값
child process가 정지했는지 종료했기 때문에 wait() 하지만 돌아왔을 경우는, 아이의 프로세스 ID 가 소환측 프로세스에 되돌려집니다. 그 외의 경우는 -1 이 되돌려져 errno 하지만 에러를 나타내도록(듯이) 설정됩니다.

child process가 정지하고 있는지 종료했기 때문에 wait4(), wait3(), waitpid() 하지만 돌아왔을 경우는, 아이의 프로세스 ID 가 소환측 프로세스에 되돌려집니다. 아직 wait 되어 있지 않은 child process가 존재하지 않는 경우는,-1 이 되돌려져 errno 하지만 ECHILD (으)로 설정됩니다. WNOHANG 하지만 지정되어 정지한 아이 또는 종료한 아이가 없는 경우는 0 이 되돌려집니다. 에러가 검출되는지, 수신 시그널에 의해 이 소환이 이상종료(ABEND) 했을 경우는, -1 하지만 되돌려져 errno 하지만 에러를 나타내도록(듯이) 설정됩니다.

에러
wait() (은)는 이하의 경우에 에러가 되어, 즉시 돌아옵니다:

[ECHILD]
    소환측 프로세스는, wait 되어 있지 않은 child process를 가지지 않습니다.

[EFAULT]
    status 인수인가 rusage 인수가 위법한 주소를 가리키고 있습니다. (child process의 종료전에는 검출되지 않는 것이 있습니다. )

[EINTR]
    소환이 수신 시그널에 의해 끼어들어졌는지, 시그널에 SA_RESTART 플래그가 설정되어 있지 않습니다.

표준
wait() 함수와 waitpid() 함수는 POSIX 에 의해 정의되고 있습니다. wait4() (와)과 wait3() (은)는 POSIX 의 사양이 아닙니다. WCOREDUMP() 매크로 및 보류중의 wait() 소환을 재개하는 기능은 POSIX 인터페이스의 확장 기능입니다.

관련 항목
ptrace(2), sigaction(2), _exit(2), exit(3)

역사
wait() 함수는, AT&T UNIX 그리고 등장했습니다.