좀비란 무엇일까
좀비는 살아있지도 죽어있지도 않은... 뭐 그런 생명체이지 않은가
마찬가지로 살아있지도 죽어있지도 않은 그런 프로세스를 말 그대로 좀비 프로세스라고 한다.
분명 이 프로세스가 할 일은 끝났지만서도 소멸되지 않고 여전히 메모리 공간에서 리소스를 차지하고 있다는 것이다.
자식 프로세스가 종료되면서 반환하는 값이 부모 프로세스에 전달되지 않으면 해당 프로세스는 소멸하지 않고 좀비로 남는다.
자식 프로세스의 종료 값이 OS에 전달되는 경로는 크게 두 가지이다.
부모 프로세스에서 wait 함수를 실행하면 자식 프로세스가 종료되기를 기다린다.
이 때 자식 프로세스가 종료되지 않고 있다면 블로킹 상태에 놓이게 된다.
보통 wait(&status)
처럼 자식 프로세스가 exit이나 return 과 함께 넘겨주는 값을 받아오는 방식으로 사용한다.
그리고 뒤이어 status 값을 두 가지 방법으로 확인할 수 있다.
WIFEXITED
: 자식 프로세스가 정상 종료한 경우 참(true)WEXITSTATUS
: 자식 프로세스의 전달 값#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *statloc, int options);
전달 인자로는 다음과 같다.
pid
: 종료 여부를 확인하고자 하는 자식 프로세스의 ID. -1을 전달하면 임의의 자식 프로세스가 종료하기를 기다린다.statloc
: wait
의 status
와 동일options
: WHOHANG
을 전달하면 종료된 자식이 없을 때 블로킹되지 않고 0을 반환하며 함수를 종료시킨다.wait 함수는 블로킹 상태에 빠질 수 있는 반면에 waitpid 함수는 블로킹 상태에 놓이지 않게끔 할 수 있다.
waitpid(-1, &status, WHOHANG);
을 호출하게 되면 임의의 자식 프로세스가 소멸되기를 기다리며, 종료된 자식 프로세스가 없을 때 0을 반환한다.