좀비 프로세스(Zombie Process)
•
자식 프로세스가 먼저 종료되었지만, 부모 프로세스가 자식 프로세스의 종료 상태를 회수하지 못한 경우에 자식 프로세스는 좀비 프로세스가 된다.
•
좀비 프로세스를 없애기 위해서는 부모 프로세스에서 wait 시스템 콜을 호출하여 좀비 프로세스의 종료 상태를 회수하면 된다.
•
좀비 프로세스가 쌓이게 되면 리소스 유출을 야기할 수 있기 때문에 좀비 프로세스 상태를 오래 유지하지 않도록 부모 프로세스는 wait 시스템 콜 함수를 사용해 자식 프로세스의 종료 상태를 읽어들여야 한다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
pid_t childPid;
childPid = fork();
if(childPid > 0) { // 부모 프로세스
printf("부모 PID : %ld, pid : %d\n",(long)getpid(), childPid);
sleep(30);
printf("부모 종료\n");
exit(0);
}
else if(childPid == 0){ // 자식 코드
printf("자식 시작 PID : %ld\n", (long)getpid());
sleep(1);
printf("자식 종료\n");
exit(0);
}
else { // fork 실패
perror("fork Fail! \n");
return -1;
}
return 0;
}
C
복사
고아 프로세스(Orphan Process)
•
부모 프로세스가 자식 프로세스보다 먼저 종료되는 경우 자식 프로세스는 고아 프로세스가 된다.
•
고아 프로세스가 작업을 종료하면 리눅스 시스템 상의 init 프로세스가 wait을 통해 자원을 회수하여 PID 가 1로 변한다. (대부분의 Linux 에서 init 프로세스의 PID 는 1이기 때문이다.)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t childPid;
int i;
childPid = fork();
if(childPid > 0) { // 부모 프로세스
printf("부모 PID : %ld, pid : %d\n",(long)getpid(), childPid);
sleep(2);
printf("부모 종료\n");
exit(0);
}
else if(childPid == 0){ // 자식 코드
printf("자식 시작\n");
for(i=0;i<10;i++) {
printf("자식 PID : %ld 부모 PID : %ld\n",(long)getpid(), (long)getppid());
sleep(1);
}
printf("자식 종료\n");
exit(0);
}
else { // fork 실패
perror("fork Fail! \n");
return -1;
}
return 0;
}
C
복사