• 使用Linux下的“信号“实现一些简单功能


    部分概念摘录自《UNIX环境高级编程》

    信号是软件中断

    信号提供了一种处理异步事件的方法。

    每个信号都有一个名字,都以3个字符SIG开头。

    实际上,实现将各信号定义在另一个头文件中,但是该头文件又包括在<signal.h>中。Linux 将信号定义在<bits/signum.h>。

    不存在编号为 0 的信号。
    kill 函数对信号编号 0 有特殊的应用。POSIX.1将此种信号编号值称为空信号。

    Linux查看支持的信号:

    $ kill -l
     1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
     6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
    11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
    16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
    21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
    26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
    31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
    38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
    43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
    48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
    53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
    58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
    63) SIGRTMAX-1  64) SIGRTMAX
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    硬件、软件、用户、错误、收发到数据、、、等等各种场景都可能产生信号。

    在某个信号出现时,有三种处理方式。

    (1)忽略此信号。大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略。它们是SIGKILL和SIGSTOP。

    (2)捕捉信号。内核在信号发生时,调用一个用户函数对这种事件进行的处理。。注意,不能捕捉SIGKILL和SIGSTOP信号。
    注:
    可以为各种错误、异常等信号编写处理函数。

    (3)执行系统默认动作。注意,对大多数默认动作是终止该进程。

    UNIX系统信号机制最简单的接口是signal函数。

    #include <signal.h>
    void (*signal(int signo, void (*func)(int)))(int);
    
    • 1
    • 2

    signal函数由ISO C定义。因为ISO C不涉及多进程、进程组以及终端I/O等,所以它对信号的定义非常含糊,以致于对UNIX系统而言几乎毫无用处。

    因为signal的语义与实现有关,所以最好使用sigaction函数代替signal函数。
    signo参数是信号名。

    func参数:
    1、SIG_IGN 忽略信号(SIGKILL和SIGSTOP不能忽略)
    2、SIG_DFL 系统默认动作
    3、用户函数的地址 执行信号处理程序。

    注意,在UNIX系统中,kill命令和 kill函数只是将一个信号发送给一个进程或进程组。该信号是否终止进程则取决于该信号的类型,以及进程是否安排了捕捉该信号。

    简单实现

    #include<signal.h>
    #include<iostream>
    using namespace std;
    
    static void sig_func(int signo){
    
        cout<<"signal number is:"<<signo<<endl;
    
    }
    
    int main(int argc, char const *argv[])
    {
        
        signal(SIGUSR1,sig_func);
        while (1)
        {
            /* code */
        }
        
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    sh下:

    指令	:
    kill -USR1 1926
    
    返回:
    signal number is:10
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    软件测试面试简历,三年测试项目经验怎么写?
    csp202009-1称检测点查询(java实现)
    【深度学习CV-baseline】GoogleNet-更深的卷积神经网络
    springboot集成达梦数据库,打包后,tomcat中启动报错
    区块链(9):java区块链项目的Web服务实现之实现web服务
    测试人生 | 半年涨薪20W入职名企大厂,这个90后妹纸凭什么这么猛?
    光模块厂家如何实现千兆和万兆的大规模量产
    深入浅出理解CSS中的3D变换:踏上立体视觉之旅
    centos7 mysql5.7离线安装
    关于iview select 绑定两个值的方法
  • 原文地址:https://blog.csdn.net/kuno_y/article/details/125450487