zoukankan      html  css  js  c++  java
  • C语言信号学习笔记

    在C语言中,对于错误有很多处理方式。然而,今天学习了信号处理,感觉这种处理方式十分灵活,特此记录。

    关于信号处理的函数包含于头文件<signal.h>中。所谓的信号,多指出乎程序员意料的行为,包括程序本身的行为(即错误)和用户的行为。当有错误或者外部事件发生时,我们称产生了一个信号。

    signal.h中定义了若干宏与相应的信号对应,比较常用的有:

    宏名 含义
    SIGABRT 异常终止
    SIGFPE 在算术运算中发生错误
    SIGILL 无效指令
    SIGINT 中断
    SIGSEGV 无效存储访问
    SIGTERM 终止请求


    其中,signal函数用于处理信号,将相应的信号和自己编写的函数关联,达到执行相应指令的目的。有点类似于事件侦听器。原型如下:

    void (*signal(ing sig, void (*func)(int)))(int);

    用法如下:

    signal (SIGINT, handler);

    另外,raise函数可以手工地产生一个信号,用法如下:

    raise(SIGABRT); // raises the SIGABRT signal.

    示例程序:

    /* tsignal.c
     * To test signals.
     * By Eric Brown
     */
    
    #include <signal.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void handler(int sig);
    
    int main(void)
    {
        signal(SIGFPE, handler);
        
        int x, y, result;
        printf("Please input two integer: ");
        
        scanf("%d%d", &x, &y);
        result = x / y;
        
        //signal(SIGABRT, handler);
        raise(SIGABRT);
        
        printf("Program run here!
    ");
        return 0;
    }
    
    void handler(int sig)
    {
        if (sig == SIGFPE)
        {
            printf("We get a SIGFPE signal.
    ");
            exit (EXIT_FAILURE);
        }
        if (sig == SIGABRT)
        {
            printf("We get a SIGABRT signal.
    ");
        }
    }

    运行效果如下:



  • 相关阅读:
    csu1804
    uvalive4513
    poj3264(Sparse-Table 算法模板)
    uva11107(后缀数组)
    poj2774(最长公共子串)
    uvalive4108(线段树)
    hdu5306 Gorgeous Sequence
    bzoj2823: [AHOI2012]信号塔&&1336: [Balkan2002]Alien最小圆覆盖&&1337: 最小圆覆盖
    bzoj3330: [BeiJing2013]分数
    bzoj1283: 序列
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3310639.html
Copyright © 2011-2022 走看看