본문 바로가기
Language/C언어

C051_waitpid 함수 사용하기

by OdOp 관리자 2024. 1. 9.
SMALL

어제 wait 함수에 대해 설명을 해드렸습니다. 

 

어떻게 보면 wait의 상위 버전인 waitpid에 대해 설명을 해드리도록 하겠습니다. 

 

자식 프로세스가 종료되지 않는다면 blocking에 빠지게 됩니다. 

너무 새로운 말이 등장을 했네요. blocking이 무엇일까요??

간단하게 설명을 해드리도록 하겠습니다. 

프로그램의 모든 동작은 cpu가 하게 됩니다.

근데 cpu를 받아도 instruction 즉, 컴퓨터에 지시를 못 내리는 경우가 있습니다. 

이러한 경우를 blocking라고 합니다. blocking이 되는 이유는 더 많이 있는데 여기서는 그 부분까지 다루지는 않겠습니다. 

 

waitpid는 만약 자식 프로세스가 blocking 상태가 일정시간 유지된다면 자식프로세스가 종료되게 해 줍니다. 

 

또 다른 차이점은 waitpid는 자식프로세스에만 국한되지 않습니다. 

다양한 프로세스에 적용이 가능하다는 점이 wait함수와 다릅니다. 

 

waitpid

#include <sys/wait.h>

pid_t waitpid(pid_t pd, int *status, int options);

 

pd는 어떤 프로세스가 종료되는 것을 기다릴지를 결정해 줍니다. 

status는 자식 프로세스 종료 시 나오는 return 값이나 exit의 인자값이 저장됩니다. 

options은 다양한 값들이 있는데 그중 3가지만 살펴보도록 하겠습니다. 

WUNTRACED : STOP 시그널을 통해 실행을 멈춘 자식 프로세스의 status를 반환합니다. 
WCONTINUED : CONT 시그널을 통해 실행을 재개한 자식 프로세스의 status를 반환합니다. 
WNOHANG : 자식 프로세스의 종료를 기다리지 않고 즉시 자식 프로세스의 status를 반환합니다. 

 

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

int main(void)
{
    int num;
    int status;
    pid_t newpid;

    num = 10;
    newpid = fork();
    if (newpid < 0)
    {
        perror(NULL);
        return (1);
    }
    if (newpid == 0)
    {
        printf("this is child process.\n");
        num *= 2;
        printf("%d\n", num);
        printf("child process finish.\n");
        while (1);
    }
    else 
    {
        waitpid(newpid, &status, WNOHANG);
        printf("this is parent process.\n");
        num *= -2;
        printf("%d\n", num);
        printf("parent process finish.\n");
    }
    return (0);
}

 

위의 코드와 같이 자식 프로세스에서 "while (1)"로 인해 무한 루프에 빠졌습니다. 

하지만 waitpid의 옵션으로 인해 무한루프를 잘 빠져나왔습니다. 

아래는 출력값입니다. 

this is parent process.
-20
parent process finish.
this is child process.
20
child process finish.
LIST

'Language > C언어' 카테고리의 다른 글

C053_dup2 함수 사용하기  (0) 2024.01.11
C052_dup 함수 사용하기  (0) 2024.01.10
C050_wait 함수 사용하기  (1) 2024.01.08
C049_fork 함수 사용하기  (2) 2024.01.07
C048_unlink 함수 사용하기  (0) 2024.01.06