C함수 자식 프로세스가 종료될 때까지 대기 wait()
자식 프로세스 작업이 끝날 때 까지 대기하며, 자식 프로세스가 종료한 상태를 구합니다.
- 헤더: wait.h
- 형태: pid_t wait(int *status)
- 인수: int status 자식 프로세스 종료 상태
- 반환: pid_t 종료된 자식 프로세스 ID
wait()함수를 실행하면 자식 프로세스가 종료될 때가지 대기합니다. 만일 자식 프로세스가 정상 종료하여 main()에서 return 값을 반환하거나, 또는 exit()로 값을 반환하며 정상 종료했다면 wait( int *status)에서 status의 변수 값의 상위 2번째 바이트에 반환 값을 저장합니다.
또는, 어떤 시그널에 의해 종료되었다면 최하위 바이트에 시그널 번호가 저장됩니다. 즉,
8비트 | 8비트 | |
정상 종료 | 프로세스 반환 값 | 0 |
비정상 종료 | 0 | 종료 시킨 시그널 번호 |
C언어 wait() 함수 예제
#include <stdio.h>
#include <unistd.h>
#include <wait.h>
int main()
{
int counter = 1;
int status;
pid_t pid;
pid_t pid_child;
pid = fork();
switch( pid){
case -1 :
printf( "자식 프로세스 생성 실패!\n");
return -1;
case 0 :
printf( "저는 자식 프로세스로 5까지 카운트하고 종료하겠습니다.\n");
while( 6 > counter ){
printf( "자식: %d\n", counter++);
sleep( 1);
}
return 99;
default :
printf( "저는 부모 프로세스로 자식 프로세스 작업이 \
끝날 때 까지 대기합니다.\n");
pid_child = wait( &status);
printf( "종료된 자식 프로세스 ID는 %d이며,", pid_child);
if ( 0 == ( status & 0xff)){
printf( "정상적으로 종료되었고 반환값은 %d입니다.\n", status >> 8);
} else {
printf( "비 정상으로 종료되었고 종료 시그널 번호는 %d입니다.\n", status);
}
printf( "이제 제일을 처리하겠습니다.\n");
while( 1 ){
printf( "부모: %d\n", counter++);
sleep( 1);
}
}
}
C언어 wait() 예제 실행 결과
]$ ./a.out
저는 부모 프로세스로 자식 프로세스 작업이 끝날 때 까지 대기합니다.
저는 자식 프로세스로 5까지 카운트하고 종료하겠습니다.
자식: 1
자식: 2
자식: 3
자식: 4
자식: 5
종료된 자식 프로세스 ID는 13826이며,정상적으로 종료되었고 반환값은 99입니다.
이제 제일을 처리하겠습니다.
부모: 1
부모: 2
부모: 3
부모: 4
부모: 5
부모: 6
부모: 7
^C
]$
참고
정상적으로 종료되었는지, 자식 프로세스의 반환값이 얼마인지를 확인하기 위해 status값을 직접 비트값을 확인하는 방법을 사용했습니다만, 이미 wait.h에 필요한 값을 뽑아주는 매크로가 정의되어 있습니다. 이 매크로를 사용하시면 앞으로 gcc 가 버전업해서 다른 형식으로 바뀐다해도 부담이 없습니다.
매크로 | 설명 |
WIFEXITED( status) | 자식 프로세스가 정상적으로 종료되었다면 TRUE |
WIFSIGNALED( status) | 자식 프로세스가 시그널에 의해 종료되었다면 TRUE |
WIFSTOPPED( status) | 자식 프로세스가 중단되었다면 TRUE |
WEXITSTATUS( status) | 자식 프로세스가 정상 종료되었을 때 반환한 값 |
이 매크로를 사용하면 아래와 같이 코드를 수정할 수 있습니다.
// 정상 종료를 확인하는 코드는 다음과 같이 수정할 수 있습니다.
if ( 0 == ( status & 0xff)) -> if ( WIFEXITED( status))
// 자식이 반환한 코드를 아래와 같이 바꿀 수 있습니다.
status >> 8 -> WEXITSTATUS( status)
'컴퓨터 > 프로그래밍' 카테고리의 다른 글
C언어 자식 프로세스 종료 확인 함수 waitpid () (2) | 2020.03.15 |
---|---|
C언어 프로그램 종료 때 실행할 함수 등록 함수 atexit() (0) | 2020.03.15 |
C언어 프로그램 종료 함수 exit() (0) | 2020.03.15 |