[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