我公司的邮件服务器是UNIX系统,这段时间不能正常的收发邮件,有ps -ef看进程时发现有大量的僵尸(defunct)进程,只有重起。可是挨不到一上午,就又不能收发邮件了。看进程还是看到好多的僵尸(defunct)进程。那只有在重起了。可这不是解决的办法。能告诉我怎么处理这个僵尸(defunct)进程,才能让系统正常的运行。
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:
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 进程 彻底 怎么 #59 僵尸 quot 回复 SIGCHLD 信号 defunct |
注册
个人空间
