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. Femtocell家庭基站通信截获、伪造任意短信漏洞

    阿里移动安全团队与中国泰尔实验室无线技术部的通信专家们一起,联合对国内运营商某型Femtocell基站进行了安全分析,发现多枚重大漏洞,可导致用户的短信.通话.数据流量被窃听.恶意攻击者可以在免费申领 ...

  2. vue 移动端添加 时间日期选择器

    效果: index.vue <template> <div class="user-wrap" style="padding-bottom: 0;tex ...

  3. 应用“PUSH推送”的5个真相和5个误区

      真相一:用户厌烦的并不是推送功能本身 针对如何看待推送功能这一问题,对1万名用户进行了问卷调查,结果表明80%的用户表示不会拒绝推送功能.各个年龄段方面没有太大的差别,但女性用户更容易受个人兴趣和 ...

  4. Python装饰器的通俗理解

    转载:http://blog.csdn.net/u013471155 在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略 ...

  5. 第十五篇 make中的隐式规则概述

      前面我们讲到了makefile的依赖拆分的知识,现在可以引申出这样一个问题,如果同一个目标的不同命令拆分的写到不同地方会发生什么?下面我们给出程序和执行结果:   可见后面的命令会覆盖前面的命令, ...

  6. Texas Instruments matrix-gui-2.0 hacking -- app_description.php

    <?php /* * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ * * * Redistrib ...

  7. ubuntu12.04 alternate win7 双系统安装

    ubuntu alternate的安装比desktop复杂一点,因为alternate的安装过程有个步骤是检测cd-rom,如果你是刻盘安装,自然没问题,但是,现在的安装一般是将系统刻到U盘里,或者在 ...

  8. JS经典面试题

    自己总结了一些JS面试题 希望能够帮助正在找工作的程序猿(●´∀`●) 1.js 实现一个函数对javascript中json 对象进行克隆 var oldObject ="sdf" ...

  9. 转 JavaScript中判断对象类型的种种方法

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

  10. web开发的一些总结

    现在我们是在互联网的时代,到处可以使用internet 这些年的发展,让we 成为了当前开发的主流,包括现在好多的移动端开发, 很多也是使用web 页面进行呈现,因为web 拉近了你我之间的距离.对于 ...