信号可以理解成一种软件中断。他提供了一种异步处理事件的方式。每个信号都有一个与之对应的信号名,这些信号名都带有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. zepto.js 的tap事件中点击一次触发两次事件

    html代码: <div class="xh-lxx-cart-count1"> <span class="minus">-</s ...

  2. maven:pom.xml中没有dependency标签错误

    dependency的标签是包含在dependencies中的.

  3. 【HTML】html5新属性-datalist

    摘要: 为实现输入域自动填充的效果 方法一: jquery-ui的autocomplete方法, 不是jquery 自带的方法. 方法二: 采用html5新特性,datalist,例子如下:坏处很明显 ...

  4. Docker学习--->>Docker的认识,安装,及常用命令熟悉

    Docker是什么? 在平常的软件开发中,会面临着开发不同的程序或服务需要不同的环境.而在该环境上开发完成后,想要在其他的环境上部署,则需要自己去重新部署,而Docker的出现使得这样的迁移变得容易. ...

  5. JavaSE(七)之内部类

    上一篇我们学习了接口还有访问控制,在以后的工作中接口是我们经常要碰到的,所以一定要多去回顾.接下来介绍一下内部类.很多时候我们创建类的对象的时候并不需要使用很多次,每次只使用一次 这个时候我们就可以使 ...

  6. POJ-1182 食物链(并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 75814   Accepted: 22528 Description ...

  7. C#设计模式(2)-简单工厂模式

    引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...

  8. java IO流整理

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  9. 初学IOS之TableView

    PS:tableview作为IOS的UI界面的重点,今天我只学习一部分,在下文列出. 下文我以创建省份为例子,用纯代码的方式创建,但是并不是最优代码,仅作熟悉tableview的创建使用. ----- ...

  10. Oracle B-tree、位图、全文索引三大索引性能比较及优缺点汇总

    引言:大家都知道“效率”是数据库中非常重要的一个指标,如何提高效率大家可能都会想起索引,但索引又这么多种,什么场合应该使用什么索引呢?哪种索引可以提高我们的效率,哪种索引可以让我们的效率大大降低(有时 ...