阅 读 文 章

怎么彻底的杀僵尸(defunct)进程?

[来源:网上转载 (http://www.chinaunix.net) | 作者:网友(wyhan) | 时间:2007-05-27 | 浏览:人次 ]


我公司的邮件服务器是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&#59;
    newact.sa_flags   = 0&#59;
    newact.sa_handler = WaitChld&#59;// WaitChld为SIGCHLD信号处理函数名
    sigemptyset(&newact.sa_mask)&#59;
    sigaction(SIGCHLD, &newact, NULL)&#59;



// WaitChld函数

void WaitChld(int sig)
{
    char    szRtnMsg[128]&#59;
    int     status, chld_term_sig&#59;
    pid_t   pid&#59;

    pid = waitpid(0, &status, WNOHANG)&#59;

    if (WIFEXITED(status) != 0)     // 子进程正常退出
        return&#59;

    strcpy(szRtnMsg, "子进程异常终止")&#59;

    chld_term_sig = WTERMSIG(status)&#59;
    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)")&#59;
        break&#59;

    case SIGQUIT:
    case SIGKILL:
    case SIGTERM:
        strcat(szRtnMsg, "(Killed)")&#59;
        break&#59;

    default:
论坛热门帖子: [lch203] 写得蛮好的linux学习笔记(10-21)
[黑马制造] 学习java的30个目标(10-19)
[笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19)
[udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18)
[沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18)
TAG标签: 进程 彻底 怎么 #59 僵尸 quot 回复 SIGCHLD 信号 defunct

最新评论 共有0位网友发表了评论

发表评论

评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名:(注册)
密码:
验证码:
匿名发表

网站地图友情连接交流论坛网站投稿广告服务联系我们留言本站长统计
Some rights reserved: www.chmhome.com, 鄂ICP备07010232号 E-mail:chinakafei@live.com,QQ:552766
中国咖啡技术网(Chmhome):国外编程技术书籍,中文编程手册,经典编程文章,交流技术,技术软件下载,计算机论文,毕业论文.