Linux中的信号

信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件)。每个信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD、SIGINT等,它们在系统头文件中定义,也可以通过在shell下键入kill –l查看信号列表,或者键入man 7 signal查看更详细的说明。

 
 

kill -l

1) SIGHUP        2) SIGINT          3) SIGQUIT         4) SIGILL         5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

信号是由内核生成,让内核生成信号的请求来自3个地方:

  • 用户:用户能够通过输入CTRL+c、Ctrl+,或者是终端驱动程序分配给信号控制字符的其他任何键来请求内核产生信号;
  • 内核:当进程执行出错时,内核会给进程发送一个信号,例如非法段存取(内存访问违规)、浮点数溢出等;
  • 进程:一个进程可以通过系统调用kill给另一个进程发送信号,一个进程可以通过信号和另外一个进程进行通信。

由进程的某个操作产生的信号称为同步信号(synchronous signals),例如除0;由像用户击键这样的进程外部事件产生的信号叫做异步信号。(asynchronous signals)。

进程接收到信号以后,可以有如下3种选择进行处理:

  • 接收默认处理:接收默认处理的进程通常会导致进程本身消亡。例如连接到终端的进程,用户按下CTRL+c,将导致内核向进程发送一个SIGINT的信号,进程如果不对该信号做特殊的处理,系统将采用默认的方式处理该信号,即终止进程的执行;
  • 忽略信号:进程可以通过代码,显示地忽略某个信号的处理,例如:signal(SIGINT,SIGDEF);但是某些信号是不能被忽略的,
  • 捕捉信号并处理:进程可以事先注册信号处理函数,当接收到信号时,由信号处理函数自动捕捉并且处理信号。

有两个信号既不能被忽略也不能被捕捉,它们是SIGKILL和SIGSTOP。即进程接收到这两个信号后,只能接受系统的默认处理,即终止线程。

当一个进程执行信号处理时,如果还有其他信号到达,那么新的信号会被阻断直到处理器返冋为止。

在程序执行时,出现了一个错误或任何异常,内核就可以使用信号来通知相应的进程。

 
 
信号

用于通信、同步进程和简化进程间通信、处理异常和中断

当一个事件发生时,会产生一个信号,然后内核会将事件传递到接收的进程。

  运行在用户模式下的进程接收到信号后会进行相应的处理
  运行在内核模式下的进程接收到信号时,会等到该进程返回到用户模式时才会开始
  发送到非运行进程的信号一定是由内核保存,直到进程重新执行为止
 

休眠的进程可以是可中断的,也可以是不可中断的。

如果一个在可中断休眠状态的进程(例如,等待终端输入的进程)收到了一个信号,那么内核会唤醒这个进程来处理信号。

如果一个在不可中断休眠状态的进程收到了一个信号,那么内核会拖延此信号,直到该事件完成为止

信号的名称和值

下标所列出的信号是 POSIX 标准的一部分,它们通常被缩写成不带SIG前缀,例如,SIGHUP 通常被简单地称为 HUP。

信 号
默认行为
描 述
信号值
信 号
默认行为
描 述
信号值
SIGABRT 生成 core 文件然后终止进程 这个信号告诉进程终止操作。ABRT 通常由进程本身发送,即当进程调用 abort() 函数发出一个非正常终止信号时 6
SIGALRM 终止 警告时钟 14
SIGBUS 生成 core 文件然后终止进程 当进程引起一个总线错误时,BUS 信号将被发送到进程。例如,访问了一部分未定义的内存对象 10
SIGCHLD 忽略 当了进程结束、被中断或是在被中断之后重新恢复时,CHLD 信号会被发送到进程 20
SIGCONT 继续进程 CONT 信号指不操作系统重新开始先前被 STOP 或 TSTP 暂停的进程 19
SIGFPE 生成 core 文件然后终止进程 当一个进程执行一个错误的算术运算时,FPE 信号会被发送到进程 8
SIGHUP 终止 当进程的控制终端关闭时,HUP 信号会被发送到进程 1
SIGILL 生成 core 文件然后终止进程 当一个进程尝试执行一个非法指令时,ILL 信号会被发送到进程 4
SIGINT 终止 当用户想要中断进程时,INT 信号被进程的控制终端发送到进程 2
SIGKILL 终止 发送到进程的 KILL 信号会使进程立即终止。KILL 信号不能被捕获或忽略 9
SIGPIPE 终止 当一个进程尝试向一个没有连接到其他目标的管道写入时,PIPE 信号会被发送到进程 13
SIGQUIT 终止 当用户要求进程执行 core dump 时,QUIT 信号由进程的控制终端发送到进程 3
SIGSEGV 生成 core 文件然后终止进程 当进程生成了一个无效的内存引用时,SEGV 信号会被发送到进程 11
SIGSTOP 停止进程 STOP 信号指示操作系统停止进程的执行 17
SIGTERM 终止 发送到进程的 TERM 信号用于要求进程终止 15
SIGTSTP 停止进程 TSTP 信号由进程的控制终端发送到进程来要求它立即终止 18
SIGTTIN 停止进程 后台进程尝试读取时,TTIN 信号会被发送到进程 21
SIGTTOU 停止进程 后台进程尝试输出时,TTOU 信号会被发送到进程 22
SIGUSR1 终止 发送到进程的 USR1 信号用于指示用户定义的条件 30
SIGUSR2 终止 同上 31
SIGPOLL 终止 当一个异步输入/输出时间事件发生时,POLL  信号会被发送到进程 23
SIGPROF 终止 当仿形计时器过期时,PROF 信号会被发送到进程 27
SIGSYS 生成 core 文件然后终止进程 发生有错的系统调用时,SYS 信号会被发送到进程 12
SIGTRAP 生成 core 文件然后终止进程 追踪捕获/断点捕获时,会产生 TRAP 信号。 5
SIGURG 忽略 当侖一个 socket 有紧急的或是带外数据可被读取时,URG 信号会被发送到进程 16
SIGVTALRM 终止 当进程使用的虚拟计时器过期时,VTALRM 信号会被发送到进程 26
SIGXCPU 终止 当进程使用的 CPU 时间超出限制时,XCPU 信号会被发送到进程 24
SIGXFSZ 生成 core 文件然后终止进程 当文件大小超过限制时,会产生 XFSZ 信号 25

25 Linux中的信号的更多相关文章

  1. 2.2 linux中的信号分析

    信号: 信号是UNIX系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动. 信号是因为某些错误条件而产生的,比如内存段冲突.浮点处理器错误或者非法指令等. 信号是在软件层次上对中断的一种 ...

  2. Linux中多线程信号的处理

    1. 博文:Linux多线程中使用信号-1  http://blog.csdn.net/qq276592716/article/details/7325250 2. 博文:Linux多线程信号总结  ...

  3. 2.3 linux中的信号分析 阻塞、未达

    信号的阻塞.未达: linux中进程1向进程2发送信号,要经过内核,内核会维护一个进程对某个信号的状态,如下图所示: 当进程1向进程2发送信号时,信号的传递过程在内核中是有状态的,内核首先要检查这个信 ...

  4. linux中的信号机制

    概述 Linux信号机制是在应用软件层次上对中断机制的一种模拟,信号提供了一种处理异步事件的方法,例如,终端用户输入中断键(ctrl+c),则会通过信号机制停止一个程序[1]. 这其实就是向那个程序( ...

  5. [2019.03.25]Linux中的查找

    TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...

  6. linux中的信号简介和trap命令

    1.信号 linux通过信号来在运行在系统上的进程之间通信,也可以通过信号来控制shell脚本的运行 主要有一下信号 1 ##进程重新加载配置 2 ##删除进程在内存中的数据 3 ##删除鼠标在内存中 ...

  7. Java基础(一):I/O多路复用模型及Linux中的应用

    IO多路复用模型广泛的应用于各种高并发的中间件中,那么区别于其他模式他的优势是什么.其核心设计思想又是什么.其在Linux中是如何实现的? I/O模型 I/O模型主要有以下五种: 同步阻塞I/O:I/ ...

  8. Linux内核中的信号机制--一个简单的例子【转】

    本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123 ...

  9. linux中的常用信号

    linux中的常用信号,见如下列表: 信号名 值 标注 解释 ------------------------------------------------------------------ HU ...

随机推荐

  1. mysql3_pymysql

    python数据库编程 1.pyshon数据库接口(python DB-API) 1.为开发人员提供的数据库应用编程接口 2.python支持的数据库服务软件 mysql,oracle,sql_ser ...

  2. C语言关于指针函数与函数指针个人理解

    1,函数指针 顾名思义,即指向函数的指针,功能与其他指针相同,该指针变量保存的是所指向函数的地址. 假如是void类型函数指针定义方式可以是 void (*f)(参数列表);亦可以先用 typedef ...

  3. python 匹配中文字符

    参考: http://hi.baidu.com/nivrrex/blog/item/e6ccaf511d0926888d543071.html           http://topic.csdn. ...

  4. C语言编译器开发之旅(开篇)

    编译器写作之旅   最近在Github上看到一个十分有趣的项目acwj(A Compiler Writing Journey),一个用C语言编写编译器的项目.身为一个程序员,这在我看来是一件十分酷的事 ...

  5. 为什么选择b+树作为存储引擎索引结构

    为什么选择b+树作为存储引擎索引结构 在数据库或者存储的世界里,存储引擎的角色一直处于核心位置.往简单了说,存储引擎主要负责数据如何读写.往复杂了说,怎么快速.高效的完成数据的读写,一直是存储引擎要解 ...

  6. Jmeter- 笔记5 - 从响应数据提取信息

    JSON提取器 提取 响应体(response body)里的信息 在需要提取数据的请求下添加 JSON提取器,一个JSON提取器可以写多个json提取器 路径:后置处理器 -> JSON提取器 ...

  7. 五、SVM推导过程

    SVM 时间复杂度一般为O(N³) 最重要的是推导过程 NIPS(机器学习顶级会议) 如果给定一个训练集,我们的目标是给定一个边界(一条线),离他最近的训练集样本路越宽越好 下面的几张图反映了SVM的 ...

  8. Caffe实现概述

    Caffe实现概述 目录 一.caffe配置文件介绍 二.标准层的定义 三.网络微调技巧 四.Linux脚本使用及LMDB文件生成 五.带你设计一个Caffe网络,用于分类任务 一.caffe配置文件 ...

  9. YOLOvi(i=1,2,3,4)系列

    YOLOvi(i=1,2,3,4)系列 YOLOv4论文链接:https://arxiv.org/pdf/2004.10934.pdf YOLOv4源码链接:https://github.com/Al ...

  10. 高动态范围(High-Dynamic Range,简称HDR)

    高动态范围(High-Dynamic Range,简称HDR) 一.HDR介绍 高动态范围(High-Dynamic Range,简称HDR),又称宽动态范围技术,是在非常强烈的对比下让摄像机看到影像 ...