각각의 자식 프로세스의 상태를 관리할 필요가 있다면 따로 관리 풀을 만들어야겠지만, 굳이 필요 없다면 그냥 waitpid로 잘 받았다고 확인만 해주면 됩니다. (man waitpid를 한번쯤 살펴보세요. 자식 프로세스의 번호를 알 필요가 없을 경우에는 어떻게 해야하는지 나와있을겁니다)
흠..저도 잘은 모르지만..
자식 프로섹스가 종료됐다고 해서 바로 종료가 되는게 아닙니다.
운영체제(커널)에게서 자식프로세스의 종료시 리턴값을 부모프로세스가 받아가기 전까진 메모리에 남아있습니다.
그러므로 부모프로세스가 그에대한 적절한 처리를 해주지 않으면 좀비가 되는걸로 알고 있습니다.
제가 알기로는 자식 프로세스가 죽었을때, 부모가 처리를 해주지 않으면 좀비가 되는게 아니라, 자식이 죽었을 경우 우선 좀비가 되는것으로 알고 있습니다.
즉, 좀비 상태라는 것이 자식이 죽었을때 부모가 자식의 종료 상태등을 얻기 위해 존재하게 됩니다. 이 경우 부모가 자식이 죽은후 바로 wait 등을 해서 종료 상태를 얻고 자식이 가진 자원등을 해제해주면 좀비 상태에서 벗어나 완전히 소멸되지만, 그렇지 않은 경우에는 계속 좀비 상태로 남아있게 됩니다.
SIG_CHLD에 대한 handler를 만들어주세요.
SIG_CHLD에 대한 handler를 만들어주세요.
음음..
음음..
SIGCHLD에 대한 핸들러를 만드니..
자식이 죽을때 17번이 넘어오네요;; 그건 알겠는데;;
그렇다면.. 부모는 자식의 pid를
뭐 링크드 리스트라던가.. 이런걸로 관리를 해야 하는건가요?
그래서 SIGCHLD가 올때마다
죽 검색해보며 자식이 살아있는지 죽었는지 보고
죽었으면, 종료되거나 멈춘 상태라면
죽이는 형식으로 진행되는건가요?
waitpid라는 함수는
넌블러킹 함수인가요?
자식의 pid를 한번 죽 돌려보면서
child_pid가 반환되는 자식은..
어떻게 죽여야 하는지..
글이 너무너무 두서가 없네요 -0-
VENI VIDI VICI
각각의 자식 프로세스의 상태를 관리할 필요가 있다면 따로 관리 풀을 만들
각각의 자식 프로세스의 상태를 관리할 필요가 있다면 따로 관리 풀을 만들어야겠지만, 굳이 필요 없다면 그냥 waitpid로 잘 받았다고 확인만 해주면 됩니다. (man waitpid를 한번쯤 살펴보세요. 자식 프로세스의 번호를 알 필요가 없을 경우에는 어떻게 해야하는지 나와있을겁니다)
waitpid는 "wait"라는 말 답게 블러킹함수입니다.
참고입니다만.. SIGCHLD의 핸들러를 SIG_IGN으로 설정하시면,
참고입니다만.. SIGCHLD의 핸들러를 SIG_IGN으로 설정하시면,
알아서 child가 좀비가 되는 것을 막아줍니다.
하지만 이것은 BSD 계열의 익스텐션이므로 포터블한 프로그램에서는
사용하지 않는 편이 좋습니다. 리눅스에서는 잘 작동했던 기억입니다.
----
Let's shut up and code.
>.<
SIGCHLD는 기본값이 SIG_IGN라고 써있는걸 봤는데
아닌가 보네요;;
child가 알아서 죽네요 -0-
정확히 어떻게 구현이 저렇게 되는지는 모르겠지만..
자식이 부모에게 시그널을 보내고
기본설정이 어떻길래 좀비로 남는건지 모르겠네요;;
여튼! 좀비가 사라지니 너무 행복합니다 감사해요^^
VENI VIDI VICI
[quote="progcom"]...waitpid는 "wait"라
세번째 인자인 options에 WNOHANG 을 주면 non-blocking으로 동작합니다.
child가 죽으면 SIG_CHLD가 뜨니까 waitpid()를 blocking 모드로 불러도
죽은 child -_- 가 기다리고 있으니까 대부분 문제가 없겠지만,
Posix 시그널 semantics에 따르면 reliable한 시그널이 제공되지 않는 경우에는
해당 시그널 핸들러가 수행되는 도중 발생하는 동일한 시그널에 대해서는
두개 이상 큐잉되는 것을 보장하지 않습니다.
이게 문제되는 경우가, 여러개의 child가 충분히 짧은 시간안에 와장창 죽는 경우
SIG_CHLD 핸들러에서 해당 이벤트들을 충분히 빨리 처리하지 못한다면
손실되는 SIG_CHLD가 있을 수 있다는 것이죠.
SIG_CHLD에 의존해서 resource를 해제하는 경우에는 좀비 뿐만이 아니라
자원의 leak까지 발생할 수 있는 가능성이 있고요.
간단한 샘플 프로그램을 작성하셔서 확인해 보시면
충분히 가능한 시나리오라는 것을 아실 수 있습니다.
Stevens 의 Unix Network Programming vol. 1 2판의 5.8, 5.9, 5.10 절에
이와 관련된 설명이 나와있습니다.
Stevens가 제시한 해법은,
SIG_CHLD 핸들러가 호출됐을 때 더 이상 child가 없을 때까지
waitpid()를 호출하는 것입니다.
이렇게 하기 위해서는 waitpid()를 non-blocking으로 부를 수 있는 방법이 있어야겠죠.
(그렇지 않으면 child를 다 wait한 상태에서 그 다음에 부른 waitpid()에서 bloking이 될테니까요.)
코드는 간단합니다.
signal 관련 함수도 Posix 계열 signal 함수를 사용하는 것이 좋겠죠?
흠..저도 잘은 모르지만..자식 프로섹스가 종료됐다고 해서 바로 종료
흠..저도 잘은 모르지만..
자식 프로섹스가 종료됐다고 해서 바로 종료가 되는게 아닙니다.
운영체제(커널)에게서 자식프로세스의 종료시 리턴값을 부모프로세스가 받아가기 전까진 메모리에 남아있습니다.
그러므로 부모프로세스가 그에대한 적절한 처리를 해주지 않으면 좀비가 되는걸로 알고 있습니다.
제가 알기로는 자식 프로세스가 죽었을때, 부모가 처리를 해주지 않으면 좀
제가 알기로는 자식 프로세스가 죽었을때, 부모가 처리를 해주지 않으면 좀비가 되는게 아니라, 자식이 죽었을 경우 우선 좀비가 되는것으로 알고 있습니다.
즉, 좀비 상태라는 것이 자식이 죽었을때 부모가 자식의 종료 상태등을 얻기 위해 존재하게 됩니다. 이 경우 부모가 자식이 죽은후 바로 wait 등을 해서 종료 상태를 얻고 자식이 가진 자원등을 해제해주면 좀비 상태에서 벗어나 완전히 소멸되지만, 그렇지 않은 경우에는 계속 좀비 상태로 남아있게 됩니다.
Dream, Passion and Challenge..
댓글 달기