Search
Duplicate

좀비 프로세스 & 고아 프로세스

태그
1 more property

좀비 프로세스(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
복사