Linux,  Programming

[Linux] wait() System Call 함수

자식 프로세스 작업이 끝날 때 까지 대기하며, 자식 프로세스가 종료한 상태를 구한다. wait()함수를 실행하면 자식 프로세스가 종료될 때까지 대기한다. 만일 자식 프로세스가 정상 종료하여, main()에서 return 으로 값을 반환하거나, 또는 exit()로 값을 반환하며 정상 종료했다면 wait( int *status) 에서 status의 변수 값의 상위 2번째 바이트에 반환 값을 저장합니다.
또는 어떤 signal에 의해 종료되었다면 최하위 바이트에 signal number가 저장된다.

특정 signal들은 core 파일들을 생성하는데 이 때 하위 바이트 중 최상위 bit를 1로 설정한다. 대표적으로 kill 3번 signal인 SIGQUIT (Ctrl + backspace)가 있다.

8 Bit8 Bit
정상 종료프로세스 반환 값0
비정상 종료0종료 시킨 시그널 번호
최상위 1-bit이 1로 설정된 경우는 core dumped file 생성
#include <wait.h>

pid_t wait(int *status)
Argumentint *statusChild process 종료 상태
Returnpid_t종료된 child process PID
#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);
         }
      }
   }
}
$ ./a.out 저는 자식 프로세스로 5까지 카운트하고 종료하겠습니다.
자식: 1
저는 부모 프로세스로 자식 프로세스 작업이 끝날 때 까지 대기합니다..
자식: 2
자식: 3
자식: 4
자식: 5
종료된 자식 프로세스 ID는 5484이며,정상적으로 종료되었고 반환값은 99입니다
이제 제일을 처리하겠습니다.
부모: 1
부모: 2
부모: 3
부모: 4
부모: 5
부모: 6
부모: 7
부모: 8

Macro 사용한 예시

wait() 함수를 쓸 때 상위 바이트, 하위 바이트 masking을 쉽게 하도록 지원하는 매크로를 쓰는 예제는 아래와 같다. 아래 코드는 child process가 어떻게 죽었는지 확인 가능한 프로그램이다.

#include <stdio.h>
#include <sys/wait.h>

void exit_status(int status) {
    if(WIFEXITED(status))
        printf("Normal exit: exit(%d)\n", WEXITSTATUS(status));
    else if(WIFSIGNALED(status))
        printf("Incorrect exit: signo(%d) %s\n", WTERMSIG(status), WCOREDUMP(status)?"(core dumped)":"");
}

int main () {
    int status;
    if (fork() == 0)
        while(1);

    wait(&status);
    exit_status(status);

    return 0;
}

Reference

  1. http://forum.falinux.com/zbxe/index.php?document_srl=408545&mid=C_LIB

Leave a Reply

Your email address will not be published. Required fields are marked *