Linux中僵死进程

僵死进程是子进程在终止后,其进程表项仍被保留,等待父进程通过wait获取退出码后才能释放。这种情况发生在父进程未及时处理子进程的退出。解决方法包括忽略SIGCHLD信号或捕获该信号并调用waitpid()。通过示例代码,可以了解如何在程序中避免僵死进程的产生。

僵死进程(僵尸进程)

 

一、僵死进程产生的原因

    fork创建进程,子进程终止时,它与父进程之间还会保持联系,知道父进程也正常终止或者父进程调用wait才结束,所以进程表中子进程的表项不会立即释放,因为它的退出码还需要保存起来,以备父进程wait调用的时候使用。

子进程先于父进程结束,父进程没有获取子进程的退出码。



实验:


实验解析:

    如果用 ./main &命令运行上面的程序,然后在子进程结束后父进程结束前使用ps命令,就会看到僵死进程产生: main <defunct>.



如果此时父进程异常终止,子进程将自动把PID为1的进程(init)作为自己的父进程,子进程就不是一个僵死进程了。

 

二、如何解决僵死进程


1、程序中显示的调用signal(SIGCHLD, SIG_IGN)来忽略SIGCHLD信号,这样子进程结束后,由内核来wait和释放资源。


2、对子进程的退出捕获它们的退出信号SIGCHLD。这样就可以释放它们的资源。父进程一般没工夫在那里守着,等着子进程的退出,所以,一般使用信号的方式来处理,在收到SIGCHLD信号的时候,在信号处理函数中调用(wait)waitpid() 操作来释放他们的资源。


代码示例:

void sig_chld(int signo)   
{   
       pid_t   pid;   
       int    stat;   
          
       while((pid = waitpid(-1, &stat, WNOHANG)) > 0){   
               printf("child %d terminated\n", pid);   
       }   
        return;   
}   

然后在main()中,在fork语句的前面的某个地方设置子进程退出的信号处理函数,如下所示:

if(signal(SIGCHLD, sig_chld) == SIG_ERR)  
{  
    fprintf(stderr, "signal error : %s\n", strerror(errno));  
    return 1;  
}  











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值