并发处理时防止产生僵尸进程

本文详细解释了僵尸进程的形成原因及其解决办法,重点介绍了如何通过父进程处理SIGCHLD信号来避免僵尸进程的积累。此外,文章还概述了SIGCHLD信号的触发条件以及它在进程管理中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

死进程,同时内核会向其父进程发送SIGCHLD(或SIGCLD)信号。此时要分几种情况:  
            1、父进程处理SIGCHLD信号,调用wait,僵死进程消失。这样我们就看不到僵尸进程。  
            2、父进程忽略SIGCHLD信号,随着子进程不断产生、结束,僵死进程的数目不断增加,导致影响系统速度及其他一些问题。  
          不需长期运行的程序,即使产生子进程也不会导致大量僵死进程存在。因为,父进程退出时,其产生的子进城成为“孤儿“进程,由init(1号进程)进程接管,init进程在子进程退出时会处理SIGCHLD信号,给子进程“收尸“。  

/**
 * A handler, which is called on child proccess exit.
 */
void sig_chld_handler(void) {
 //other proccess
 while (waitpid(-1, NULL, WNOHANG) > 0);
}

 #ifdef __USE_GNU
  signal(SIGCHLD, (sighandler_t )sig_chld_handler);
 #endif
 #ifdef __USE_BSD
  signal(SIGCHLD, (sig_t )sig_chld_handler);
 #endif
signal返回值: 返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-1)。
SIGCHLD 进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽

下面的情况可以产生Signal:  

 1. 按下CTRL+C产生SIGINT  

 2. 硬件中断,如除0,非法内存访问(SIGSEV)等等  

 3. Kill函数可以对进程发送Signal  

 4. Kill命令。实际上是对Kill函数的一个包装

 5. 软件中断。如当Alarm Clock超时(SIGURG),当Reader中止之后又向管道写数据(SIGPIPE),等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值