jsn 回复于:2002-08-25 13:42:00 |
[这个贴子最后由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; } } |
zhangrp 回复于:2002-08-25 15:53:56 |
真够复杂的,看来学习不好好看书不行。 |
wyhan 回复于:2002-08-25 17:34:23 |
谢谢楼上兄弟告诉我方法。 |
ygzq 回复于:2003-04-02 10:55:15 |
[quote:20e40f9cde]真够复杂的,看来学习不好好看书不行[/quote:20e40f9cde]
9494 San Tian Bu Xue Xi, Gang Bu Shang Liu Shao Qi! |
williamw2000 回复于:2003-09-29 01:56:42 |
learning... |