defunc 에 대해서..
글쓴이: shean0 / 작성시간: 목, 2004/01/29 - 3:50오후
갑자기 서버에 접속이 되지 않는 현상이 일어났습니다.
쉘에서 자원이 없다고 telnet접속이 되지 않아서... 결국 콘솔로 접속하여..
ps -ef 보니
defunc가 15585 정도 까지채워서 있더군요.
다행이도 제일 부모프로세스(서비스프로세스)를 죽이니 없어지던군요.
재부팅해야하는지..걱정했는데.. 다행이었습니다.
문제가 여기 있는지.. 아니면 다른곳인지.. 구별이 안되어 문의드립니다.
코드 2개가 있는데요.. 현재는 위의코드로 돌아갑니다.
문제가 있는지요..문제가 있다면 그냥 간단하게 아래처럼 바꾸려구 합니다.
조언을 부탁드립니다.
1
main() { signal(SIGCHLD, sigchldCatcher); //settingsignal() 호출:아래참조 ret=fork(); if(ret) ... else ... } /***************************************** Name : sigchldCatcher() Description : Child 프로세스에 이상이 있을 경우 ********************************************/ void sigchldCatcher(int sig) { while (waitpid(-1, NULL, WNOHANG) > 0) signal(SIGCHLD, sigchldCatcher); }
이것과..
2.
main() { signal(SIGCHLD,SIG_IGN); ret=fork(); if(ret) ... else ... }
실제는 참조..
void settingsignal(void) { /* 시그널이 초*/ signal(SIGHUP, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGILL, ignoreThisSignal); /* 잘못된 명령어*/ signal(SIGABRT, ignoreThisSignal); /* 중단 시그널*/ signal(SIGSEGV, ignoreThisSignal); /* 잘못된 메모리 참조*/ signal(SIGTERM, ignoreThisSignal); /* 종료시그널*/ signal(SIGCONT, ignoreThisSignal); /* 중단시 재개*/ signal(SIGURG, ignoreThisSignal); /* 소켓에 긴급상황 발생*/ signal(SIGPOLL, ignoreThisSignal); /* 폴링 시그널*/ signal(SIGXCPU, ignoreThisSignal); /* CPU 제한 초과*/ signal(SIGXFSZ, ignoreThisSignal); /* 파일 제한 초과*/ signal(SIGPIPE, sigpipeCatcher); /* 파이프 시그널*/ signal(SIGCHLD, sigchldCatcher); signal(SIGCHLD, sigchldCatcher); }
위의 1,2 코드에 문제가 없다면.. 다른 원인으로는 무엇을 확인해 보아야 할가요??
Forums:
signal() 과 sigaction()의 차이를 알아보시기 바랍니다.
signal() 과 sigaction()의 차이를 알아보시기 바랍니다.
signal()을 쓰는 것은 좋지 않은 프로그래밍 습관입니다.
========================================
* The truth will set you free.
댓글 달기