Linux CC++信号6

Linux CC++信号6,第1张

文章目录
  • 一、SIGCHLD信号
  • 二、代码示例(使用SIGCHLD信号解决僵尸进程问题)
  • 总结


一、SIGCHLD信号

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

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

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信号.

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/713674.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存