C언어 자식 프로세스 종료 확인을 위한 매크로

2020. 3. 15. 11:50 컴퓨터/프로그래밍

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
]$


이 댓글을 비밀 댓글로