信号可以理解成一种软件中断。他提供了一种异步处理事件的方式。每个信号都有一个与之对应的信号名,这些信号名都带有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. Selenium webdriver定位iframe里面元素两种方法

    以东方财富网登录页面为例: 在查找元素过程中,直接通过id或者xpath等找不到元素,查看页面源代码发现元素是属于iframe里,例如: <div class="wrap_login& ...

  2. django MVC模式 数据库的操作mysql

    介绍:本节课我们继续学习djangoWEB框架的开发,这节课主要是学习如何访问数据库,django如何自动为我们创建好表结构等相关内容. 1.首先我们打开settings.py找到DATABASES关 ...

  3. hdu_1907:John(Nim变形)

    题目链接 仍是取石子,不过取到最后一个的败 参考链接:http://www.voidcn.com/blog/liwen_7/article/p-3341825.html 简单一句话就是T2 S0必败 ...

  4. (转)AJax跨域:No 'Access-Control-Allow-Origin' header is present on the requested resource

    在本地用ajax跨域访问请求时报错: No 'Access-Control-Allow-Origin' header is present on the requested resource. Ori ...

  5. org.w3c.dom.Element 缺少 setTextContent 步骤

    org.w3c.dom.Element 缺少 setTextContent 方法 今天将项目环境由jdk5改为jdk6,eclipse重新编译工程后,却突然出现org.w3c.dom.Element没 ...

  6. [Tyvj 1952] Easy

    P1952 Easy 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下 ...

  7. webpack vue2.0项目脚手架生成的webpack文件

    var path = require('path') var utils = require('./utils') var config = require('../config') var vueL ...

  8. 表达式求值(二叉树方法/C++语言描述)(二)

    表达式二叉树节点的数据可能是运算数或运算符,可以使用一个联合体进行存储:同时还需要一个变量来指示存储的是运算数还是运算符,可以采用和栈方法求值中一样的枚举类型TokenType: typedef en ...

  9. 使用递归算法结合数据库解析成java树形结构

    使用递归算法结合数据库解析成java树形结构 1.准备表结构及对应的表数据a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHA ...

  10. linux指令大全

    系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...