Linux程序设计之利用信号捕捉函数实现子进程资源回收

1.当子进程结束时会产生SIGCHLD信号,可以利用信号捕捉函数捕捉此信号,然后调用回调函数,回收子进程的资源,避免产生僵尸进程。

2.代码如下:

/*捕捉子进程的结束信号,并且在父进程中通过进程捕捉函数,调用回调函数,完成子进程的资源回收*/
#define _XOPEN_SOURCE   

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

void my_fun(int num)
{
    printf("被处理的信号为:%d\n",num);
    //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);

    pid_t pid;
    for(int i = 0;i < 10 ;i++ )
    {
        pid = fork();   //循环的创建子进程
        if(pid == 0)
        {
            break;
        }
    }

    if(pid > 0)
    {
        //父进程
        //捕捉子进程结束时的信号SIGCHLD
        struct sigaction act; 
        act.sa_flags = 0;
        act.sa_handler = my_fun;
        sigemptyset(&act.sa_mask);
        sigaction(SIGCHLD,&act,NULL);   //捕捉子进程结束时的信号

        //捕捉到信号以后,解除信号集的阻塞
        sigprocmask(SIG_UNBLOCK,&set,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;
}

3.运行结果:

4.总结:对系统中的信号进行捕捉以后,可自行设计回调函数完成需要进行的操作。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值