Linux下信号SIGCHLD处理不当产生僵尸进程的问题

LINUX 通过fork创建子进程时,如果子进程退出,内核会向父进程发送SIGCHLD信号,这样由父进程回收子进程的资源,避免产生僵尸进程,

产生僵尸进程的本质是该进程的内核资源未被释放,本着谁创建谁释放的原则,则是父进程释放,所以需要在父进程处理SIGCHLD信号。

一般代码如下:

 signal(SIGCHLD, OnSignalSIGCHLD);

static void OnSignalSIGCHLD(int signo)
{
 pid_t pid;
 int status = 0;
 pid = waitpid( -1, &status, 0);

}

单如果在处理OnSignalSIGCHLD同时,又产生了多个SIGCHLD信号,则有些信号会忽略,因为linux信号不排队,以最后一个为主。


这样如果父进程fork了 多个子进程,子进程同时退出。则可能存在多个SIGCHLD信号同时产生,用以上的信号处理就会出现僵尸进程。

合理的做法应该是


static void OnSignalSIGCHLD(int signo)
{
 pid_t pid;
 int status = 0;
 while ((pid = waitpid( -1, &status, WNOHANG))>0)//WNOHANG避免阻塞

{

   //do my code

}


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值