10-01 프로세스의 이해와 활용 (3)
- 좀비 프로세스의 소멸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;
}