栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux C/C++信号6

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux C/C++信号6

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


一、SIGCHLD信号

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

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

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

    while(1)
    {
        int ret =waitpid(-1,NULL,WNOHANG);
        if(ret>0)
        {
            printf("child die,pid =%dn",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:%dn",getpid());
            sleep(2);
        }
    }else if(pid==0)
    {//子进程
        printf("child process pid:%dn",getpid());
    }


    return 0;
}
总结

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/828225.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号