• 一个特殊的信号---- SIGCHILD


    这里重点提一下SIGCHLD信号(17号信号),对于父进程而言,一般要对它的子进程进行等待,以防止子进程变为僵尸进程,而导致内存泄漏问题,但是对于父进程的等待方式存在两种:阻塞式等待和非阻塞式等待,可以通过wait和waitpid这两个系统调用来实现,对于父进程而言,阻塞式等待让父进程停下自己手头上的事情,专心的等待子进程退出,这严重影响了父进程的工作;而对于非阻塞式等待,父进程每隔一段时间都要轮循一下,看看子进程有没有退出,这也让我们的程序变的复杂,所以我们就想能不能让父进程对于子进程的等待变成子进程退出了就通知父进程进行回收,也就是让对子进程的等待变成异步等待,不干扰父进程的正常工作呢?

    这里就得了解一下父进程是如何知道子进程已经退出的,也就是我们的SIGCHLD这个信号的作用,当子进程退出时,会向父进程发送SIGCHLD信号,而父进程就是根据是否收到这个信号来判断子进程是否退出的,所以我们可以编写如下的子进程异步等待方式:

    #include<stdio.h>
    #include<signal.h>
    #include<sys/wait.h>
    #include<sys/types.h>
    #include<stdlib.h>
     
    void handler(int sig)
    {
        do{
            pid_t ret;
            if((ret=waitpid(-1,NULL,WNOHANG))>0) //-1---表示对任意进程进行等待,以非阻塞方式加轮循,应对同一时间多个子进程退出
            {
                printf("wait scuess,pid is %d
    ",ret);
            }
            else
            {
                printf("no child exit now
    ");
                break;
            }
        }while(1);
    }
     
    int main()
    {
     
        signal(SIGCHLD,handler);
     
        pid_t pid=fork();
        if(pid>0)
        {
            while(1)
            {
                printf("the parent is doing...
    ",pid);
                sleep(1);
            }
        }
        else
        {
            printf("the child pid is %d
    ",getpid());
            sleep(3);
            exit(1);
        }
        return 0;
    }

    除了这种异步等待的解决办法,其实还可以将SIGCHLD信号的默认动作修改成SIG_IGN,这样一来在子进程退出之时,就会自动将资源进行释放,不会产生僵尸进程,但是这种方法对于Linux有效,对于别的Unix系统不一定有效

    转载自:https://blog.csdn.net/chenkaixin_1024/article/details/77745993

  • 相关阅读:
    BDOC ROUTER
    web dom api中的Selection和Range
    基于第三方vuejs库组件做适配性个性开发
    香草js侦测元素是否离开视窗viewport
    xampp windows10下xdebug调试环境安装及配置
    beyond compare全文件夹比较,仅显示变化的文件
    给定制的vuejs组件添加v-model双向绑定支持
    javascript工厂函数(factory function)vs构造函数(constructor function)
    edrawmax使用技巧备忘
    babel plugin和presets是什么,怎么用?
  • 原文地址:https://www.cnblogs.com/oneDongHua/p/14264048.html
Copyright © 2020-2023  润新知