[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 Bit | 8 Bit | |
---|---|---|
정상 종료 | 프로세스 반환 값 | 0 |
비정상 종료 | 0 | 종료 시킨 시그널 번호 최상위 1-bit이 1로 설정된 경우는 core dumped file 생성 |
#include <wait.h> pid_t wait(int *status)
Argument | int *status | Child process 종료 상태 |
Return | pid_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
- http://forum.falinux.com/zbxe/index.php?document_srl=408545&mid=C_LIB