zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    May 1 2017 Week 18 Monday
    April 30 2017 Week 18 Sunday
    April 29 2017 Week 17 Saturday
    April 28 2017 Week 17 Friday
    April 27 2017 Week 17 Thursday
    April 26 2017 Week 17 Wednesday
    【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式
    April 25 2017 Week 17 Tuesday
    April 24 2017 Week 17 Monday
    为什么丑陋的UI界面却能创造良好的用户体验?
  • 原文地址:https://www.cnblogs.com/hkyst/p/7678019.html
Copyright © 2011-2022 走看看