ps -ef | grep def 에 대해서..
글쓴이: shean0 / 작성시간: 금, 2003/01/24 - 6:36오후
안녕하세요..
이렇게 했을때...나오는 메세지에 대해서... 알려주셨으면..합니다.
그리고..
이렇게 나오는 이유가.
signal(SIGCHID); 을 안해주어서 그렇다고 알고 있는데...
즉, fork시에 부모 프로세스가 sigchid 를 받았다는 처리를 안 해주어서 ..그렇다고 알고 있는데요...
조금더 자세하게 알고 싶습니다.
그리고..이렇게 존재하는 "좀비"프로세스를
novice 26052 24362 0 0:00 <defunct>
novice 2649 21642 0 0:00 <defunct>
novice 18163 21642 0 0:00 <defunct>
novice 2679 21642 0 0:00 <defunct>
novice 18159 21642 0 0:00 <defunct>...
를 죽이는 방법이 알고 싶습니다..
이것이 자원을 사용하고..반환되지 않아서..문제가 되거든요..
매번 도움만 청하는 novice~ 꾸벅...
Forums:
프로세스가 종료하게 되면, 커널은 프로세스에 할당된 자원을 해제하고 프로
프로세스가 종료하게 되면, 커널은 프로세스에 할당된 자원을 해제하고 프로세스 상태를 zombie 상태로 표시하게 됩니다.
ps 에서 보이는 defunct 상태가 그것이죠.
바로 종료 안하고 중간에 zombie 라는 상태를 둔것은 자식 프로세스가 실행한 작업이
성공적으로 수행되었나 부로프로세스가 알기 위한 방법을 제공하기 위해서입니다.
자식프로세스가 죽게되면 부모프로세스는 SIGCHLD 시그널을 받게돼고, wait 계열의 시스템콜을 호출해서
자식 프로세스가 수행한 작업의 결과를 알게 됩니다.
그 다음에 커널은 자식프로세스에 관련된 커널자료를 완전히 삭제하게 됩니다.
만약 부모프로세스가 이러한 SIGCHLD 시그널 처리를 제대로 하지 않게 되면, 자식프로세스들은 계속 zomebie 상태로 있게 됩니다.
해결책은 부모프로세스를 종료해야만 합니다. 그려면, 부모프로세스는 init 로 바뀌게 되고,
init 프로세스가 wait 를 수행해서 자식프로세스를 완전 제거하게 됩니다.
그 다음에 SIGCHLD 시그널을 처리하는 부분을 수정하시면 됩니다.
네..명쾌하신 설명 감사드립니다..예전에 배우기는 했지만..실전에서
네..명쾌하신 설명 감사드립니다..
예전에 배우기는 했지만..실전에서 이렇게 쓰일줄 몰랐네요..
다른 프로그램짤때는 넣었는데(습관적으로..) 이번 프로그램에서는 생략해서..
이렇게 되었네요..순간 당황했습니다..ㅠㅠ
아직두 초보라는 증거니..더 열공하겠습니다.. 다시 한번 감사드리며...
나중에 이 글을 읽으시는 분께...
그럼 이만..
언제나 즐프를 꿈꾸며~
[quote] (void)signal(SIGCHLD, SIG_IGN);
위와 같은 코드가 자동으로 자식 프로세스를 정리하는 것은 POSIX 와 호환되지는 않는다고 하네요.
System-V 계열과 리눅스에서는 통용되는데,
BSD 계열에서도 해당되는지는 잘 모르겠네요.
제일확실한 방법은 SIGCHLD 에 대한 signal handler 함수를 작성해서
그 안에서 wait 계열 함수를 호출하는 것이겠죠.
댓글 달기