• linux中的信号处理


    信号是linux中的一个重要概念,早期的Linux使用系统调用 signal 来安装信号

    #include <signal.h>
    void (*signal(int signum, void (*handler))(int)))(int);
    该函数有两个参数, signum指定要安装的信号, handler指定信号的处理函数.
    该函数的返回值是一个函数指针, 指向上次安装的handler

    经典安装方式:
    if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
    signal(SIGINT, sig_handler);
    }
    先获得上次的handler, 如果不是忽略信号, 就安装此信号的handler

    由于信号被交付后, 系统自动的重置handler为默认动作, 为了使信号在handler处理期间, 仍能对后继信号做出反应, 往往在handler的第一条语句再次调用signal

    sig_handler(ing signum)
    {
    /* 重新安装信号 */
    signal(signum, sig_handler);
    ......
    }
    我们知道在程序的任意执行点上, 信号随时可能发生, 如果信号在sig_handler重新安装信号之前产生, 这次信号就会执行默认动作, 而不是sig_handler. 这种问题是不可预料的. 这两点构成了信号的基本使用方式。

    注意:Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做"不可靠信号",信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可靠信号。这就是"不可靠信号"的来源。它的主要问题是:进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。 kill -l查看所有可用的信号

    可靠信号与不可靠信号, 实时信号与非实时信号
    可靠信号就是实时信号, 那些从UNIX系统继承过来的信号都是非可靠信号, 表现在信号不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值小于SIGRTMIN的都是非可靠信号.
    非可靠信号就是非实时信号, 后来, Linux改进了信号机制, 增加了32种新的信号, 这些信号都是可靠信号, 表现在信号支持排队, 不会丢失, 发多少次, 就可以收到多少次. 信号值位于 [SIGRTMIN, SIGRTMAX] 区间的都是可靠信号.

  • 相关阅读:
    面试收集—hello,world 也有新花样
    div+css优缺点
    css固定textarea文本域尺寸
    Python if __name__ == "__main__":
    ActionScript3.0基础教程
    【转】Flex代码生成器 (FCG)
    手机第一博文
    TabNavigator只初始化第一个TAB 引发的未初始化对象错误
    如何对待懒惰的小孩
    对孩子真诚就是尊重孩子,不要随意表扬
  • 原文地址:https://www.cnblogs.com/njucslzh/p/2849790.html
Copyright © 2020-2023  润新知