[这个贴子最后由jsn在 2002/08/25 01:48pm 编辑]
父进程在fork出子进程后,如果子进程死了,父进程没有给它收尸,就会产生僵尸进程。要杀死僵尸进程,只有两个办法:1、改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。 2、把父进程杀掉。父进程死后,它产生的所有僵尸进程也跟着消失。 以solaris为例:
// 在父进程中接管SIGCHLD信号 newact.sa_handler = Quit; newact.sa_flags = 0; newact.sa_handler = WaitChld;// WaitChld为SIGCHLD信号处理函数名 sigemptyset(&newact.sa_mask); sigaction(SIGCHLD, &newact, NULL);
// WaitChld函数 void WaitChld(int sig) { char szRtnMsg[128]; int status, chld_term_sig; pid_t pid; pid = waitpid(0, &status, WNOHANG); if (WIFEXITED(status) != 0) // 子进程正常退出 return; strcpy(szRtnMsg, "子进程异常终止"); chld_term_sig = WTERMSIG(status); switch (chld_term_sig) { case SIGILL: case SIGTRAP: case SIGABRT: //case SIGEMT: case SIGFPE: case SIGBUS: case SIGSEGV: //case SIGSYS: case SIGXCPU: strcat(szRtnMsg, "(CoreDumped)"); break; case SIGQUIT: case SIGKILL: case SIGTERM: strcat(szRtnMsg, "(Killed)"); break; default: break; } } |