1. 信号的基本概念

1.1 基本概念

(1)信号(signal)机制是linux系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化。

(2)信号本质上是在软件层次上对中断机制的一种模拟,是一种软件中断

(3)信号是异步事件

  ①不可预见;

  ②信号有自己的名称和编号(/usr/include/bits/signum.h);

  ③信号和异常处理机制;

(4)信号发生的来源

  ①硬件来源:比如我们按下了键盘或者其它硬件故障,信号是由硬件驱动程序产生。

  ②软件来源:最常用发送信号的系统函数是kill、raise、alarm和settimer等函数,软件来源还包括了一些非法运算等操作,软件设置等条件(如gdb调试),信号是由内核产生的。

1.2 系统信号

信号

说明

默认动作

SIGHUP(1)

连接断开信号。登录linux时,系统会分配给用户一个终端(session)。在这个终端运行的所有程序,包括前台和后台进程组,一般都属于这个session。当用户退出linux时,前台进程组和所有有终端输出的进程都会收到SIGHUP信号。

终止进程

SIGINT(2)

程序终止信号,在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程

终止进程

SIGQUIT(3)

和SIGINT类似,但由QUIT字符(通常是Ctrl-\)来控制。进程在因收到SIGQUIT退出时会产生core文件,在这个意义上类似于一个程序错误信号。

终止+core

SIGILL(4)

执行非法指令。通常是因为可执行文件本身出现错误,或者试图执行数据段、堆栈溢出时也可能产生这个信号。

终止+core

SIGTRAP(5)

由断点指令或其它trap指令产生。由debugger使用

终止+core

SIGABRT(6)

异常终止,调用abort函数生成的信号

终止+core

SIGBUS(7)

非法地址,包括内存对齐出错。

终止+core

SIGFPE(8)

在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0等其它所有的算术错误。

终止+core

SIGKILL(9)

用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。

终止

SIGUSR1(10)

留给用户使用

终止

SIGSEGV(11)

试图访问未分配给自己的内存,或试图往没有写权限的内存地址写数据

终止+core

SIGUSR2(12)

留给用户使用

终止

SIGPIPE(13)

写到无读进程的管道。即读管道没有打开或者意外终止,这时写进程会收到该信号

终止

SIGALRM(14)

时钟定时信号,计算的是实际的时间或时钟时间。alarm函数使用该信号。

终止

SIGTERM(15)

程序结束(terminate)信号,与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出。只有在进程终止不了,才SIGKILL

终止

SIGCHLD(17)

子进程结束时,父进程会收到该信号。如果父进程先终止,由子进程的终止由init进程接管。

忽略

SIGCONT(18)

让一个停止(stopped)的进程继续执行。本信号不能被阻塞。可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作。如重新显示提示符。

继续/忽略

SIGSTOP(19)

停止(stopped)进程的执行。注意它和terminate以及interrupt的区别:该进程还未结束,只是暂停。本信号不能被阻塞,处理或忽略

暂停进程

SIGTSTP(20)

停止进程的运行,但该信号可以被处理或忽略。用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号。

暂停进程

SIGTTIN(21)

当后台作业要从用户终端读数据时,该作业中的所有进程会收到SIGTTIN信号。缺省这些进程会停止执行。

暂停进程

SIGTTOU(22)

类似于SIGTTIN,但在写终端(或修改终端模式)时收到。

暂停进程

SIGURG(23)

有“紧急”数据或out-of-band数据到达socket时产生。

忽略

SIGXCPU(24)

超过CPU时间资源限制。这个限制可以由getrlimit/setrlimit来读取/改变。

终止+core

SIGXFSZ(25)

当进程企图扩大文件以致于超过文件大小资源限制

终止+core

SIGVTALRM(26)

虚拟时钟信号。类似于SIGALARM,但是计算的是该进程占用CPU的时间

终止

SIGPROF(27)

类似于SIGALARM/SIGVTALARM,但包括进程用的CPU时间以及系统调用的时间。

终止

SIGWINCH(28)

终端窗口大小改变时发出

忽略

SIGIO(29)

文件描述符准备就绪,可以开始进行输入/输出操作。

终止/忽略

SIGPWR(30)

电源失效/重启动

终止/忽略

SIGSYS(31)

非法的系统调用

终止+core

1.3 信号的处理方式

处理方式

说明

忽略信号

SIGKILL和SIGSTOP永远不能忽略②忽略硬件异常;③进程启动时SIGUSR1和SIGUSR2两个信号被忽略

执行默认操作

每个信号有默认动作,大部分信号默认动作是终止进程。

捕获信号

①告诉内核出现信号时调用自己的处理函数

②SIGKILL和SIGSTOP不能被捕获

1.4 信号处理机制

(1)进程如何发现和接受信号

  ①信号是异步的,进程不可能一直等待信号的到来,也不知道信号会到来。

  ②信号的接收不是用户进程完成的,而是由内核代理。

  ③当进程p2向进程p1发送信号后,内核接受到信号,并将其放入p1的信号队列中。当p1进程陷入内核态并准备返回用户态时会检查信号队列然后根据相应的信号调取相应的信号处理函数

(2)信号的检测和响应时机

  ①当前进程由于系统调用、中断或异常而进入系统空间以后(陷入内核态),从系统空间返回到用户空间的前夕会检测信号队列

  ②当前进程在内核进入睡眠以后刚被唤醒或者由于不可忽略的信号存在而需提前返回到用户空间时,也会检测信号队列并调用相应的信号处理函数。

(3)信号处理函数执行完毕

  当信号处理函数执行完毕之后,进程会主动调用sigreturn()再次回到内核。查看有没有其它信号需要处理。如果没有,内核会做一些善后工作,然后返回用户空间,至此完成了一次(或几次)信号的处理。

1.5 信号的变革

(1)信号出现在早期的Unix中,但早期的信号模型是不可靠的。

(2)BSD和System V分别对早期信号进行扩展,但是相互不兼容。

(3)POSIX统一了上述两种模型,提供了可靠信号模型。

第8章 信号(1)_Linux信号处理机制的更多相关文章

  1. 第七章 探秘Qt的核心机制-信号与槽

    第七章 探秘Qt的核心机制-信号与槽 注:要想使用Qt的核心机制信号与槽,就必须在类的私有数据区声明Q_OBJECT宏,然后会有moc编译器负责读取这个宏进行代码转化,从而使Qt这个特有的机制得到使用 ...

  2. xenomai内核解析之信号signal(二)---xenomai信号处理机制

    xenomai信号 上篇文章讲了linux的信号在内核的发送与处理流程,现在加入了cobalt核,Cobalt内核为xenomai线程提供了信号机制.下面一一解析xenomai内核的信号处理机制. 1 ...

  3. 浅谈Linux中的信号处理机制(二)

    首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...

  4. 浅谈Linux中的信号处理机制(一)

    有好些日子没有写博客了,自己想想还是不要荒废了时间,写点儿东西记录自己的成长还是百利无一害的.今天是9月17号,暑假在某家游戏公司实习了一段时间,做的事情是在Windows上用c++写一些游戏英雄技能 ...

  5. linux内核中异步通信机制--信号处理机制【转】

    转自:http://blog.csdn.net/lu_embedded/article/details/51131663 什么是异步通信?很简单,一旦设备准备好,就主动通知应用程序,这种情况下应用程序 ...

  6. Linux程序设计学习笔记——异步信号处理机制

    转载请注明出处: http://blog.csdn.net/suool/article/details/38453333 Linux常见信号与处理 基本概念 Linux的信号是一种进程间异步的通信机制 ...

  7. 第十九章 Django的ORM映射机制

    第十九章 Django的ORM映射机制 第一课 Django获取多个数据以及文件上传 1.获取多选的结果(checkbox,select/option)时: req.POST.getlist('fav ...

  8. apue 第10章 信号signal

    每种信号都有名字,都是以SIG开头 信号机制最简单的接口是signal函数 #include <signal.h> typedef void (*sighandler_t)(int); s ...

  9. 浅谈Linux中的信号处理机制(三)

    一晃眼,已经到9月底了,都来不及去感慨时间匆匆.最近常常会想明年的今天我将会在那里干着什么样的工作?对未来又是憧憬又是担忧,压力山大.无论如何现在还是踏踏实实的学习吧,能这样安安静静学习的日子也不多了 ...

随机推荐

  1. kindle看扫描版pdf的解决办法

    (1)先把PDF crop (2)转JPEG (3)JPEG根据kindle的屏幕的分辨率,调整JPEG图像大小,kindle whater paper 大小为1448*1072 (4)   最后把j ...

  2. 15款Cocos2d-x游戏源码

    (1)用cocos2d-x开发的中国象棋游戏源码 使用Cocos2d-X2.2.3开发的一款中国象棋游戏,游戏中可以实现.新局面.悔棋.游戏音乐.胜利后会显示游戏结果. 源码下载:http://www ...

  3. Oracle中varchar2类型字段长度限制使用问题

    为纪念中华人民共和国建军90周年,特此一篇,以此纪念,我军威武!!! 一.问题背景 项目中商品发布,却没有保存成功. 二.问题定位 初步判断向数据库中保存时出现了错误,查看日志文件,由于日志文件过大就 ...

  4. 第三课 操作系统开发之x86模拟环境搭建

    前面我们讲解了主引导程序的加载过程,并且制作了虚拟软盘a.img,最终这个主引导程序也在机器中成功运行了,但是实际开发的时候,并不会如此简单,免不了调试过程,如果还像上一节中直接将软盘放到机器中去加载 ...

  5. js 在IOS系统微信浏览器内如何动态给title赋值

    var body = document.getElementsByTagName('body')[0]; document.title = title; var iframe = document.c ...

  6. Flume-NG源码阅读之SpoolDirectorySource(原创)

    org.apache.flume.source.SpoolDirectorySource是flume的一个常用的source,这个源支持从磁盘中某文件夹获取文件数据.不同于其他异步源,这个源能够避免重 ...

  7. <div class="clear"></div>

    <div class="clear"></div> 这里的clear是样式名.样式写在CSS文件中 从名称来看估计你的样式为:.clear {clear:b ...

  8. 【opencv基础】pointPolygonTest

    pointPolygonTest opencv函数 pointPolygonTest: C++: double pointPolygonTest(InputArray contour, Point2f ...

  9. DS18B20配置

    复位脉冲: 先拉低至少480us,以产生复位脉冲,接着释放4.7k电阻为高,延时15~60us, 进入接收. void DS18B20_Rst(void) { DS18B20_IO_OUT(); // ...

  10. PHP CURL HTTPS内存泄露问题

    还原场景:通过一直运行脚本,向微信用户发送模板消息,发现运行了一段时间,内存就爆了,然后立马看了一下代码,发现跟其他的消息逻辑一模一样,唯一不一样的就是请求了微信的接口:然后继续开始找问题,发现当时使 ...