C언어 자식 프로세스 종료 확인을 위한 매크로
wait()나 waitpid()에서 자식 프로세스의 종료 상태를 확인하기 위한 매크로를 설명합니다.
- 헤더: wait.h
- 형태: -
- 인수: -
- 반환: -
wait()나 waitpid()에서 자식 프로세스의 종료 상태를 변수 status값으로 확인할 수 있습니다.
8비트 | 8비트 | |
정상 종료 | 프로세스 반환 값 | 0 |
비정상 종료 | 0 | 종료 시킨 시그널 번호 |
변수 값을 직접 확인하는 것보다는 wait.h에서 제공하는 매크로를 사용하는 것이 더 편하며 컴파일 업그레이드 영향을 받지 않습니다.
매크로 | 설명 |
WIFEXITED( status) | 자식 프로세스가 정상적으로 종료되었다면 TRUE |
WIFSIGNALED( status) | 자식 프로세스가 시그널에 의해 종료되었다면 TRUE |
WIFSTOPPED( status) | 자식 프로세스가 중단되었다면 TRUE |
WEXITSTATUS( status) | 자식 프로세스가 정상 종료되었을 때 반환한 값 |
status >> 8보다는 WEXITSTATUS( status)처럼 사용하는 것이 가독성이 좋고 디버깅에도 유리합니다.
예제
#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 ( WIFEXITED( status)){
printf( "정상적으로 종료되었고 반환값은 %d입니다\n", WEXITSTATUS( status));
} else {
printf( "비 정상으로 종료되었고 종료 시그널 번호는 %d입니다\n", status);
}
printf( "이제 제일을 처리하겠습니다.\n");
while( 1 ){
printf( "부모: %d\n", counter++);
sleep( 1);
}
}
}
실행 결과
]$ ./a.out
저는 부모 프로세스로 자식 프로세스 작업이 끝날 때 까지 대기합니다.
저는 자식 프로세스로 5까지 카운트하고 종료하겠습니다.
자식: 1
자식: 2
자식: 3
자식: 4
자식: 5
종료된 자식 프로세스 ID는 16371이며,정상적으로 종료되었고 반환값은 99입니다
이제 제일을 처리하겠습니다.
부모: 1
부모: 2
부모: 3
부모: 4
부모: 5
부모: 6
부모: 7
^C
]$
'컴퓨터 > 프로그래밍' 카테고리의 다른 글
C언어 다른 프로그램 실행 함수 execl() (0) | 2020.03.15 |
---|---|
C언어 자식 프로세스 종료 확인 함수 waitpid () (2) | 2020.03.15 |
C언어 자식 프로세스가 종료될 때까지 대기 함수 wait() (0) | 2020.03.15 |