• Linux 进程间通信 信号


      一、 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。

    二、信号的种类
        信号的名称是在头文件signal.h中定义的,信号都以SIG开头
        命令行输入  kill -l 即可查看所有的信号
        

    三、进程对信号的响应

      进程可以通过三种方式来响应一个信号:

    (1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP;

    (2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;

    (3)执行缺省操作,Linux对每种信号都规定了默认操作。注意,进程对实时信号的缺省反应是进程终止。

      Linux究竟采用上述三种方式的哪一个来响应信号,取决于传递给相应API函数的参数。

    四、信号的发送

      发送信号的主要函数有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。

      kill (int pid ,int signl) 既可以向自身发送信号,也可以向别的进程发送信号

      raise(int signl)  只能向进程本身发送信号。

      alarm()  在指定的时间之后发送给自己 一个 SIGALRM的信号,如果不捕捉此信号,默认是终止该进程。

          unsigned int alarm(unsigned int seconds); // 在多少秒之后

      pause()   使进程挂起直至捕捉到一个信号。

     五、信号的处理

      sighandler_t signal(int signum, sighandler_t handler);   

    signal(SIGINT, my_func);

      第一个参数指定信号的值,

      第二个参数指定针对前面信号值的处理,可以忽略该信号(参数设为SIG_IGN)可以采用系统默认方式处理信号(参数设为SIG_DFL);也可以自己实现处理方式(参数指定一个函数地址)my_func()。

      如果signal()调用成功,返回最后一次为安装信号signum而调用signal()时的handler值;失败则返回SIG_ERR。

      

    #include <signal.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void my_func(int sign_no)
    {
        if(sign_no==SIGINT)
            printf("I have get SIGINT\n");
        else if(sign_no==SIGQUIT)
            printf("I have get SIGQUIT\n");
    }
    int main()
    {
        printf("Waiting for signal SIGINT or SIGQUIT \n ");
        
        /*注册信号处理函数*/
        signal(SIGINT, my_func);
        signal(SIGQUIT, my_func);
        
        pause();
        exit(0);
    }
  • 相关阅读:
    Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)
    Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(一)
    在Ocelot中使用自定义的中间件(二)
    在Ocelot中使用自定义的中间件(一)
    基于Angular 8和Bootstrap 4实现动态主题切换
    ASP.NET Core 2.0 Web API项目升级到ASP.NET Core 3.0概要笔记
    使用Helm将ASP.NET Core应用程序部署到Kubernetes容器集群
    使用Rancher在Microsoft Azure上搭建Kubernetes集群
    容器化单页面应用中Nginx反向代理与Kubernetes部署
    在C#中使用Irony实现SQL语句的解析
  • 原文地址:https://www.cnblogs.com/hkyst/p/7678019.html
Copyright © 2020-2023  润新知