Linux C/C++信号6

35 篇文章 0 订阅
35 篇文章 0 订阅


一、SIGCHLD信号

SIGCHLD信号产生的3个条件:
1.子进程结束
2.子进程暂停了
3.子进程继续运行
他们都会给父进程发送该信号,父进程默认忽略该信号。

二、代码示例(使用SIGCHLD信号解决僵尸进程问题)

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<signal.h>
#include<sys/wait.h>

void myFun(int num)
{
    printf("捕捉到的信号:%d\n",num);
    //回收子进程PCB资源
    //while(1)
    //{
      //  wait(NULL);
    //}

    while(1)
    {
        int ret =waitpid(-1,NULL,WNOHANG);
        if(ret>0)
        {
            printf("child die,pid =%d\n",ret);
        }else if(ret ==0)
        {   //说明还有子进程
            break;
        }else if(ret==-1)
        {
            break;
        }
    }
    
}


int main()
{
    //提前设置好阻塞信号集,阻塞SIGCHLD,因为有可能子进程很快结束,父进程还没有注册完信号捕捉
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set,SIGCHLD);
    sigprocmask(SIG_BLOCK,&set,NULL);

    //注册完信号捕捉以后,解除阻塞
    sigprocmask(SIG_UNBLOCK,&set,NULL);


    //创建一些子进程
    pid_t pid;
    for(int i=0;i<20;i++)
    {
        pid=fork();
        if(pid==0)
        {

            break;
        }

    }

    if(pid>0)
    {//父进程

        //捕捉子进程死亡时发送的SIGCHLD信号
        struct sigaction act;
        act.sa_flags=0;
        act.sa_handler=myFun;
        sigemptyset(&act.sa_mask);
        sigaction(SIGCHLD,&act,NULL);

        while(1)
        {
            printf("parent process pid:%d\n",getpid());
            sleep(2);
        }
    }else if(pid==0)
    {//子进程
        printf("child process pid:%d\n",getpid());
    }


    return 0;
}

总结

今天主要给大家介绍了SIGCHLD信号.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值