waitpid 리눅스
리눅스 운영 체제에서 waitpid()
함수는 자식 프로세스의 종료를 기다리거나 상태를 확인하는 데 사용됩니다. 이 함수는 pid_t
타입의 자식 프로세스 ID를 매개변수로 받으며, 일반적으로 fork()
함수로 생성된 자식 프로세스의 ID를 사용합니다.
waitpid()
함수의 문법
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
pid
: 대기할 자식 프로세스의 ID-1
: 모든 자식 프로세스를 대상으로 대기0
: 호출한 프로세스의 그룹 ID와 동일한 프로세스 그룹 내의 모든 자식 프로세스 대상으로 대기
status
: 자식 프로세스의 종료 상태가 저장될 변수의 주소options
: 옵션 설정(flag)
waitpid()
함수의 동작 방식
waitpid()
함수는 자식 프로세스가 종료될 때까지 호출한 프로세스를 차단합니다. 자식 프로세스가 종료되면 해당 자원을 회수하고 종료 상태를 반환합니다. 이 때 종료 상태는 status
매개변수를 통해 얻을 수 있습니다.
waitpid()
함수가 반환하는 값은 대기한 자식 프로세스의 ID입니다. 만약 대기 중인 자식 프로세스가 없다면, 반환값은 -1
입니다.
waitpid()
함수의 옵션
waitpid()
함수의 옵션 매개변수인 options
는 대기 동작에 추가적인 옵션을 설정할 수 있는데, 여러 개의 옵션을 포함하는 비트 마스크로 구성됩니다.
주요 옵션은 다음과 같습니다:
WNOHANG
: 대기 중인 자식 프로세스가 없을 때 바로 반환하기 위해 사용합니다.WUNTRACED
: 자식 프로세스가 중단된 경우(SIGSTOP
시그널) 반환합니다.WCONTINUED
: 중단된 자식 프로세스가 다시 실행될 경우(SIGCONT
시그널) 반환합니다.
waitpid()
함수의 예제 코드
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid < 0) {
perror("fork() error");
exit(1);
} else if (pid == 0) {
printf("Child process\n");
sleep(5);
} else {
printf("Parent process\n");
waitpid(pid, NULL, 0);
printf("Child process terminated\n");
}
return 0;
}
위 코드는 부모 프로세스에서 자식 프로세스를 생성하고, waitpid()
함수를 사용하여 자식 프로세스가 종료될 때까지 대기합니다. 자식 프로세스는 5초 동안 실행되고 종료됩니다.
이 예제에서 waitpid()
함수의 두 번째 매개변수인 status
는 NULL
로 설정되어 자식 프로세스의 종료 상태를 확인하지 않습니다.