카테고리 없음

10-01 프로세스의 이해와 활용 (3)

babystep 2020. 12. 17. 23:47
728x90

 

  • 좀비 프로세스의 소멸1:wait 함수의 사용
    • 자식프로세스의 소멸방법에는 두가지 방법이있다. 그중 하나는 다음 함수를 호출하는것이다.
    • #include<sys/wait.h>
    • pid_t wait(int* statloc);
      • 성공시 종료된 자식 프로세스의 ID 실패시 -1 반환
    • 함수가 호출 되었을 이미 종료된 자식 프로세스가 있다면 자식 프로세스가 종료되면서 전달한 (exit함수의 인자값, main함수의 return 의한 반환값) 매개변수로 전달된 주소의 변수에 저장된다. 그런데 변수에 저장되는 값에는 자식 프로세스가 종료되면서 전달한 이외에도 다른 정보가 함께 포함되어 있으니 다음 매크로 함수를 통해서 값의 분리 과정을 거쳐야 한다.
      • WIFEXITED : 자식 프로세스가 정상 종료한 경우 "(true) 반환한다.
      • WEXITSTATUS : 자식 프로세스의 전달 값을 반환한다.
    • wait 함수의 인자로 변수 status 주소 값이 전달되었다면 wait함수의 호출 이후에는 다음과 같은 유형의 코드를 구성해야한다.
    • if(WIFEXITED(status)) // 정상 종료하였는가?
    • {
      • puts("Normal termination !");
      • printf("Child pass num: %d, WEXITSTATUS(status)); // 그렇다면 반환값은?
    • }
    • wait.c 예제

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/wait.h>

 

int main(int argc, char * argv[])

{

    int status;

    pid_t pid = fork(); // 여기서 생성된 자식 프로세스는

    //  아래의 if pid == 0 안의 return 3행에서 보이듯이 main함수 내에서의

    // return 문 실행을 통해서 종료하게 된다.

 

    if(pid == 0)

    {

        return 3;

    }

    else

    {

        printf("Child PID: %d \n", pid);

        pid = fork(); // 여기서 실행된 자식 프로세스는 아래 if문 안 exit(7)에서 종료하게된다.

        if(pid == 0)

        {

            exit(7);

        }

        else

        {

            printf("Child PID: %d \n", pid);

            wait(&status); //wait 함수를 호출하고있다 이로인해서 종료된 프로세스 관련정보는

            //status에 담기게되고 해당 정보의 프로세스는 완전히 소멸된다.

 

            // 이 매크로함수 WIFEXITED를통해서자식프로세스의 정상종료 여부를

            // 확인하고 있다.  정상종료인 경우에 한해서 WEXITSTATUS함수를호출하여

            //자식프로세스가 전달한값을 출력하고있다.

            if(WIFEXITED(status))            

                printf("Child send one: %d \n", WEXITSTATUS(status));

 

            // 앞서 생성한 자식 프로세스가 두 개이므로 또한번의 wait함수호출과

            // 매크로함수의 호출을 진행하고있다.

            wait(&status);

            if(WIFEXITED(status))

                printf("Child send two :%d \n", WEXITSTATUS(status));

 

            // 모든 프로세스의 종료를 멈추기 위해서 삽입한 코드이다 이 순간에 여러분은 자식

            // 프로세스의 상태를 확인하면 된다.

            sleep(30); // sleep 30 sec

        }

 

    }

    return 0;

}

728x90