본문으로 바로가기
homeimage
  1. Home
  2. 컴퓨터/프로그래밍
  3. C언어 자식 프로세스가 종료될 때까지 대기 함수 wait()

C언어 자식 프로세스가 종료될 때까지 대기 함수 wait()

· 댓글개 · 바다야크

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)
SNS 공유하기
💬 댓글 개
최근글
이모티콘창 닫기
울음
안녕
감사해요
당황
피폐

이모티콘을 클릭하면 댓글창에 입력됩니다.