소켓프로그래밍#7 : 좀비 프로세스

kkado·2022년 6월 4일
0
post-thumbnail

좀비 프로세스란?

좀비란 무엇일까

좀비는 살아있지도 죽어있지도 않은... 뭐 그런 생명체이지 않은가
마찬가지로 살아있지도 죽어있지도 않은 그런 프로세스를 말 그대로 좀비 프로세스라고 한다.

분명 이 프로세스가 할 일은 끝났지만서도 소멸되지 않고 여전히 메모리 공간에서 리소스를 차지하고 있다는 것이다.

좀비 프로세스가 생기는 이유??

자식 프로세스가 종료되면서 반환하는 값이 부모 프로세스에 전달되지 않으면 해당 프로세스는 소멸하지 않고 좀비로 남는다.

자식 프로세스의 종료 값이 OS에 전달되는 경로는 크게 두 가지이다.

  • 인자를 전달하면서 exit를 호출하는 경우
  • main 함수에서 return을 실행하면서 값을 반환하는 경우

좀비 프로세스의 소멸

wait

부모 프로세스에서 wait 함수를 실행하면 자식 프로세스가 종료되기를 기다린다.
이 때 자식 프로세스가 종료되지 않고 있다면 블로킹 상태에 놓이게 된다.

보통 wait(&status) 처럼 자식 프로세스가 exit이나 return 과 함께 넘겨주는 값을 받아오는 방식으로 사용한다.

그리고 뒤이어 status 값을 두 가지 방법으로 확인할 수 있다.

  • WIFEXITED : 자식 프로세스가 정상 종료한 경우 참(true)
  • WEXITSTATUS : 자식 프로세스의 전달 값

waitpid

#include <sys/wait.h>

pid_t waitpid(pid_t pid, int *statloc, int options);

전달 인자로는 다음과 같다.

  • pid : 종료 여부를 확인하고자 하는 자식 프로세스의 ID. -1을 전달하면 임의의 자식 프로세스가 종료하기를 기다린다.
  • statloc : waitstatus와 동일
  • options : WHOHANG을 전달하면 종료된 자식이 없을 때 블로킹되지 않고 0을 반환하며 함수를 종료시킨다.

wait 함수는 블로킹 상태에 빠질 수 있는 반면에 waitpid 함수는 블로킹 상태에 놓이지 않게끔 할 수 있다.

waitpid(-1, &status, WHOHANG); 을 호출하게 되면 임의의 자식 프로세스가 소멸되기를 기다리며, 종료된 자식 프로세스가 없을 때 0을 반환한다.

profile
울면안돼 쫄면안돼 냉면됩니다

0개의 댓글