• C和指针 第十六章 标准函数库 信号


    信号名<signal.h>

    程序中大多数错误都是程序本身导致的,但是,有些程序遇到的事件却不是程序本身所引发的。比如用户终止程序,程序无法预知此类事件发生的情况,信号就是为了对此类事件做出反应的。信号是一种事件,它可能异步发生。如果没有安排怎么处理一个特定的信号,那么该信号出现时,程序就做出一个缺省反应,大部分编译器都是终止程序。

    POSIX.1中列出的信号:

    信号 值 处理动作 发出信号的原因
    ----------------------------------------------------------------------
    SIGHUP 1 A 终端挂起或者控制进程终止
    SIGINT 2 A 键盘中断(如break键被按下)
    SIGQU99v 3 C 键盘的退出键被按下
    SIGILL 4 C 非法指令
    SIGABRT 6 C 由abort(3)发出的退出指令
    SIGFPE 8 C 浮点异常
    SIGKILL 9 AEF Kill信号
    SIGSEGV 11 C 无效的内存引用
    SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道
    SIGALRM 14 A 由alarm(2)发出的信号
    SIGTERM 15 A 终止信号
    SIGUSR1 30,10,16 A 用户自定义信号1
    SIGUSR2 31,12,17 A 用户自定义信号2
    SIGCHLD 20,17,18 B 子进程结束信号
    SIGCONT 19,18,25 进程继续(曾被停止的进程)
    SIGSTOP 17,19,23 DEF 终止进程
    SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键
    SIGTTIN 21,21,26 D 后台进程企图从控制终端读
    SIGTTOU 22,22,27 D 后台进程企图从控制终端写
    
    SIGINT和SIGTERM是异步发生的,它们在程序外部发生,通常时用户向程序传达一些信息。
    信号处理
    int raise(in sig);
    raise函数用于显示触发一个信号
    当信号发生时,可以有三种方式对他反应,缺省的时编译器定义的,终止程序,程序可以指定信号被忽略或者指定处理函数。
    void (*signal(int sig, void(*haddler)(int)))(int);
    

    把这段声明分开看:

    void (*signal())(int)
    

    signal是一个函数,返回值是一个指向参数为int,无返回值的指针

    signal(int sig, void(*haddler)(int))
    

    signal的参数是一个信号量,和一个处理函数。signal函数返回的函数指针,是指向之前的信号处理函数的指针,可以保存这个值,然后为信号设置处理函数,并可以在将来恢复之前的处理函数。

    在调用中,参数signum指出要设置处理方法的信号。第二个参数handler是一个处理函数,或者是
    SIG_IGN:忽略参数signum所指的信号。
    SIG_DFL:恢复参数signum所指信号的处理方法为默认值。

    #include <stdio.h>
    #include <signal.h>
    #include <zconf.h>
    
    void handler(int sig)
    {
        switch(sig){
            case SIGHUP:
                printf("get signal SIGHUP
    ");
                break;
            case SIGINT:
                printf("get signal SIGINT
    ");
                break;
            case SIGTERM:
                printf("get signal SIGTERM 
    ");
                break;
            default:
                break;
        }
    }
    
    int main()
    {
        printf("process id is %d ",getpid());
        signal(SIGHUP, handler);
        signal(SIGINT, handler);
        signal(SIGTERM, handler);
        raise(SIGTERM);
        for(;;);
        return 1;
    }
    

    运行:

     注意,每次型号发生时,需要重新设置信号处理函数。

  • 相关阅读:
    yum命令报错 yum update File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: --CentOS7.5
    CentOS7.5下安装Python3.7 --python3
    CentOS7.5安装Python3.7报错:configure: error: no acceptable C compiler found in $PATH --Python3
    ubuntu18.04.2LTS下安装和配置MySql数据库 --ubuntu
    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! --主机密钥验证失败
    iphone使用linux命令apt-get也没有问题
    百度网盘下载器 PanDownload v2.0
    iPhone越狱cydia源大全
    php判断网站收录情况
    linux下C语言三种get输入方式
  • 原文地址:https://www.cnblogs.com/yangxunwu1992/p/5875512.html
Copyright © 2020-2023  润新知