利用自定义信号处理方式预防僵尸进程

本文介绍了僵尸进程产生的原因,即父进程未回收子进程的退出状态。通过编写C程序展示了如何使用signal函数和wait函数来定制SIGCHLD信号的处理,确保父进程能及时回收子进程信息,避免僵尸进程的产生。程序中,父进程在接收到SIGCHLD信号时调用自定义的sigcallback函数,该函数执行wait函数回收子进程状态。

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

在这里结合进程信号的内容,复习一下僵尸进程形成的原因:

     子进程先于父进程退出,子进程在退出的时候,会向父进程发送SIGCHLD信号,而SIGCHLD信号的处理方式为SIG_IGN忽略处理!导致了父进程没有回收子进程的退出状态信息,从而致使子进程变成了僵尸进程。

那么咱们就利用自定义函数和wait函数,修改SIGCHLD信号的处理方式,让父进程在子进程退出的时候可以回收其退出状态信息。

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<signal.h>
  4 #include<sys/wait.h>
  5 
  6 void sigcallback(int sig){
  7   printf("sigcallback recv sig:%d\n",sig);
  8   wait(NULL);
  9 }
 10 
 11 int  main(){
 12   //目的:解放父进程,让父进程创建子进程之后,还能执行父进程的代码逻辑    ;并且还能防止子进程变成僵尸进程。
 13   //做法:
 14   //将SIGCHLD信号的处理方式进行自定义
 15   //在自定义函数当中调用wait/waitpid函数
 16   //子进程退出之后会向父进程发送SIGCHLD信号,父进程回调自定义处理函数>    ,从调用wait/waitpid函数,回收子进程的退出状态信息。
 17 
 18   signal(SIGCHLD,sigcallback);//自定义处理SIGCHLD信号
 19   pid_t ret = fork();//创建子进程
 20   if(ret<0){
 21     perror("fork");
 22     return 0;
 23   }else if(ret == 0){
 24     //child
 25     sleep(5);
 26     printf("i am child\n");
 27   }else{
 28     //father
 29     while(1){
 30       printf("i am father , exec father process code\n");
 31       sleep(1);
 32     }
 33   }
 34   return 0;
 35 } 

运行结果分析:

17号信号就是SIGCHLD信号,被我们成功改写并且预防了僵尸进程的出现:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值