信号可以理解成一种软件中断。他提供了一种异步处理事件的方式。每个信号都有一个与之对应的信号名,这些信号名都带有SIG前缀,如:SIGABRT,SIGALARM。头文件signal.h 中定义了所有的信号名,他们值为正整数常量。事实上,实现将个别信号定义在不同的头文件中,只不过这些头文件又被包含在了signal.h中;这是因为内核不可能去包含应用于用户级别程序的头文件!因此,当用户程序与内核同时需要某信息的定义时,通常的做法是把这个定义放到内核头文件中,然后在用户头文件中包含这个内核头文件。

unix系统信号列表:

当信号列表中的默认action为“terminal+core”时,他意味着进程的内存映像会留在进程目录下的core文件中。core文件可以帮助大多数UNIX系统调试者来检查进程终止时的状态。但是,如果 a)进程设置了set-user-ID而且当前用户不是进程文件的拥有者;或者 b)进程设置了 set-group-ID 而且当前用户不是进程文件的用户组拥有者;或者 c) 当前用户下该用户没有写入权;或者d) 此文件已存在而且当前用户没有写入权;或者e)文件太大时core文件不会被创建。

程序启动

当一个程序被执行的时候,所有的信号的装填要么是默认方式处理要么是忽略信号。通常,信号被设置为它们的默认处理方法,除非调用exec的进程忽略了这个信号。详细来说exec函数会将调用exec进程捕获的信号的状态更改为信号的默认处理方式而保留其他信号的处理方式,因为exec执行的新程序中不包含捕获信号的函数地址,所以这些处理方式在新程序中是无意义的。

进程创建

当一个进程调用fork时,子进程继承父进程的信号处理方式。在这里,子进程是由父进程的内存镜像的副本开始的,因此信号捕获函数的地址是有意义的。

可重入函数

当一个信号一个进程的信号处理函数捕获,此进程的正常指令执行顺序会被此信号处理短暂的中断,处理完信号后进程从之前被中断的地方继续执行。但是在信号处理函数中,我们是无法识别出当信号被捕获是进程执行到了哪一步。如果当收到信号时进程正在通过malloc从堆上分配一块额外的内存时,我们应该怎么办呢,在信号处理函数中调用malloc吗?亦或是当收到某个信号时我们正在调用某个函数,比如getpwnam,这个函数将他的返回值存储在一个静态区域,这种情况下我们应该在信号处理函数中调用同样的函数吗?在上面malloc的情景中那样做会对进程产生灾难性的后果,因为malloc通常包含一个它所有分配过的区域的链接表,也许当时它正处于更新这个链接表的状态中。在getpwnam的情境下,存储在静态区的getpwnam的返回值会被信号处理函数中的调用结果重写!

因此, The Single UNIX Specification 要求信号处理函数中的函数调用必须是安全的,即可重入的(Reentrant functions)。这些函数被 The Single Unix Specification称为异步信号安全函数(async-signal safe)。除了可重入,他们会在函数运行期间阻塞任何会破坏连续性的信号的下达。异步信号安全函数列表如下:

一些函数不被称为异步信号安全的原因大致如下:

  1. 使用了静态数据结构
  2. 调用了malloc或free
  3. 属于标准I/O库的一部分

大多数标准I/O库的实现使用了静态数据结构,他们都不是可重入函数。需要特别注意的一点是:即使我们在信号处理函数中使用异步信号安全的函数,每个线程下也仅仅只有一个errno变量(在多线程环境下,多个线程共享进程地址空间。每个线程需要它自己的errno副本以阻止线程间的相互干扰),而我们可能会潜在的修改掉errno的值。因此,有个通则:在信号处理函数中调用异步信号安全函数前,应当保存errno。

APUE 3 -- 信号(signal)<I> :概念的更多相关文章

  1. (八) 一起学 Unix 环境高级编程 (APUE) 之 信号

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  2. qt信号signal和槽slot机制

    内容: 一.概述 二.信号 三.槽 四.信号与槽的关联 五.元对象工具 六.程序样例 七.应注意的问题 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工 ...

  3. Linux 信号signal处理机制

    信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全 ...

  4. Linux信号(signal)机制【转】

    转自:http://gityuan.com/2015/12/20/signal/ 信号(signal)是一种软中断,信号机制是进程间通信的一种方式,采用异步通信方式 一.信号类型 Linux系统共定义 ...

  5. python练习笔记——利用信号signal处理僵尸进程

    1 signal处理僵尸进程的基于语法 利用信号signal处理僵尸进程的方法:signal(SIGCHLD,SIG_IGN),该方法也是第三种处理僵尸进程的方法. SIGCHLD:子进程状态改变后产 ...

  6. Linux信号signal处理机制

    信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断.从它的命名可以看出,它的实质和使用很象中断.所以,信号可以说是进程控制的一部分.         一.信号的基本概念 ...

  7. Linux进程间通信(一): 信号 signal()、sigaction()

    一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...

  8. Python标准库07 信号 (signal包,部分os包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习 ...

  9. Linux 信号signal处理函数

    转自:http://www.cnblogs.com/taobataoma/archive/2007/08/30/875662.html alarm(设置信号传送闹钟) 相关函数 signal,slee ...

  10. 进程间通信之信号量、消息队列、共享内存(system v的shm和mmap)+信号signal

    进程间通信方式有:System v unix提供3种进程间通信IPC:信号量.消息队列.共享内存.此外,传统方法:信号.管道.socket套接字. [注意上述6种方式只能用户层进程间通信.内核内部有类 ...

随机推荐

  1. JavaScript 之 HelloWorld编写

    HelloWorld.html 代码如下: <html><body><script type="text/javascript">documen ...

  2. PHP+NGINX

    1. 下载php编译包/nginx编译包(建议先装nginx再装php, php编译包我用的是5.5.35) 2. 创建好安装目录(我的编译包放在/home下) mkdir -p /usr/local ...

  3. 流畅python学习笔记:第十一章:抽象基类

    __getitem__实现可迭代对象.要将一个对象变成一个可迭代的对象,通常都要实现__iter__.但是如果没有__iter__的话,实现了__getitem__也可以实现迭代.我们还是用第一章扑克 ...

  4. documentsUI源码分析

    documentsUI源码分析 本文基于Android 6.0的源码,来分析documentsUI模块. 原本基于7.1源码看了两天,但是Android 7.1与6.0中documentsUI模块差异 ...

  5. ARM开发(2)基于STM32的蜂鸣器

    基于STM32的蜂鸣器 一 蜂鸣器原理:  1.1 本实验实现1个蜂鸣器间隔1S鸣叫.  1.2 实验思路:根据电路图原理,给蜂鸣器相关引脚赋予高低电平,实现电路的导通,使蜂鸣器实现鸣叫或不鸣.  1 ...

  6. (转)java提高篇(五)-----抽象类与接口

    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念 ...

  7. app耗电优化之四 使用AlarmManager对任务进行合理安排

    AlarmManager 是用来设定定时任务.即用来设定那个任务在什么时候开始执行.为什么和省电有关系?这个需要和AlarmManager的使用先说起.AlarmManager 实际上只起到一个定时发 ...

  8. 【网络】dns_probe_finished_nxdomain 错误

    解决方案: 谷歌浏览器地址栏输入 chrome://net-internals/#dns 清除 dns 缓存即可

  9. HDOJ2007-平方和与立方和

    Problem Description 给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和.   Input 输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成.   ...

  10. JS的事件多次触发,只执行最后一次

    有时候我们在JS编程的过程中经常遇到一个问题就是事件频繁高速被触发,利用计时器来控制频率又会丢弃掉有用的事件,我们只是想让程序执行最后一次的事件,那么就可以用如下方法解决问题 //写在事件外边,防止被 ...