[완료] fork를 통해 생성 된 자식 프로세스 제거 시 의문점??
안녕하세요 .. 리눅스 소켓 프로그래밍을 공부하던 중 .. fork함수를 통해 자식 프로세스를 생성 했을
경우 자식 프로세스가 종료가 되면 리턴 값이 커널에게 전달 되게 되고 커널이 리턴 값을 부모 프로세스
에게 전달하기 전까지 자식 프로세스를 소멸시키지 않는다고 합니다. 그래서 부모 프로세스에서는 wait
함수 또는 waitpid함수를 통해서 이미 종료 된 자식 프로세스의 리턴 값을 커널에게 달라고 요구하고
커널은 종료 된 자식 프로세스의 리턴 값을 부모 프로세스에게 전달하여 자식 프로세스를 소멸하게 된다
고 합니다. 그런데 여기서 의문점이 생겼습니다. 만약 부모 프로세스가 먼저 종료 되고 그 후에
자식 프로세스가 종료 되어 버린다면 커널은 리턴값을 전달 할 부모 프로세스가 이미 종료 되어 버렸기
때문에 리턴값을 전달 할 수 없게 되고 자식 프로세스는 좀비로 남게 되어 버리는거 아닌가요?? 이 문제를
해결하기 위해서 자식 프로세스가 먼저 종료 되기 전에 부모가 종료 되지 않도록 wait함수나 waitpid함수
부분을 루프를 돌려버리면 될 것 같지만 책에서 이 방법은 비 효율적이어서 시그널 핸들링을 사용한다고 했
는데요 .. 시그널 핸들링의 경우도 마찬가지로 부모 프로세스가 먼저 종료 되어 버린다면 시그널 핸들링
을 할 수 없기 때문에 자식 프로세스는 좀비 프로세스로 남는것 아닌가요??
이 부분이 잘 이해가 가지 않아서 책을 여러번 읽어 봤는데요.. 도무지 이해가 가지 않습니다. 좀 도와
주세요 ~ ㅡㅡ;;
부모프로세스가
부모프로세스가 종료되면 자식프로세스의 부모는 INIT프로세스 (pid=1)로 바뀝니다.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
그럼요 ~
그럼요 자식프로세스의 부모프로세스가 INIT프로세스로 변환 된다면 INIT프로세스에서 자식프로세스의
종료를 담당하잖아요... 그럼 원칙적으로 자식프로세스를 생성한 부모프로세스에서 자식프로세스를 제거
해주는게 좋지만 여의치 않다면 운영체제 차원에서 자식프로세스를 제거해 준다고 이해해도 되나요??
INIT이 부모역할 다
INIT이 부모역할 다 해주죠.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
답글 정말 감사합니다 ...
답글 정말 감사합니다. 공부에 많은 도움이 되었습니다 ~
댓글 달기