[转]Linux下的常见信号总结
转自 https://www.cnblogs.com/gaorong/p/6430905.html
在linux下有很多信号,按可靠性分为可靠信号和非可靠信号,按时间分为实时信号和非实时信号,linux进程也有三种方式来处理收到的信号:
(1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP;
(2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;
(3)执行缺省操作,Linux对每种信号都规定了默认操作。
Linux进程对实时信号的缺省反应是进程终止。但是对于高性能服务器编程来说,这是致命的缺陷,对于这类服务器需要保证在收到各种信号后仍然可以可靠运行,所以我们需要在理解各种信号的缘由和正确的处理方式。本文将笔者经常碰到的一些信号进行整理,结合自己的使用经验简要分析。
SIGHUP和控制台操作有关,当控制台被关闭时系统会向拥有控制台sessionID的所有进程发送HUP信号,默认HUP信号的action是 exit,如果远程登陆启动某个服务进程并在程序运行时关闭连接的话会导致服务进程退出,所以一般服务进程都会用nohup工具启动(该命令就是让忽略该信号)或写成一个 daemon(利用setsid进行)。
以下五组可以放在一块类比
SIGINT 终止进程,通常我们的Ctrl+C就发送的这个消息。
SIGQUIT 和SIGINT类似, 但由QUIT字符(通常是Ctrl- \ )来控制. 进程收到该消息退出时会产生core文件。
SIGKILL 消息编号为9,我们经常用kill -9来杀死进程发送的就是这个消息,程序收到这个消息立即终止,这个消息不能被捕获,封锁或这忽略,所以是杀死进程的终极武器。
SIGTERM 是不带参数时kill默认发送的信号,默认是杀死进程。
1.SIGINT SIGTERM区别
前者与字符ctrl+c关联,后者没有任何控制字符关联。
前者只能结束前台进程,后者则不是。
2.SIGTERM SIGKILL的区别
前者可以被阻塞、处理和忽略,但是后者不可以。
KILL命令的默认不带参数发送的信号就是SIGTERM.让程序有好的退出。
SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。
因为SIGTERM可以被阻塞,所以有的进程不能被结束时,需要用kill发送SIGKILL。即:kill-9 进程号。
SIGSTOP 停止进程的执行,同SIGKILL一样不可以被应用程序所处理,注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行.由 Ctrl+Z 控制,用户可以使用使用fg/bg操作恢复执行前台或后台的进程。fg命令在前台恢复执行被挂起的进程,此时可以使用ctrl-z再次挂起该进程,bg命令在后台恢复执行被挂起的进程,而此时将无法使用ctrl-z再次挂起该进程。
SIGCONT 当SIGSTOP发送到一个进程时,通常的行为是暂停该进程的当前状态。如果发送SIGCONT信号,该进程将仅恢复执行。除了其他目的,SIGSTOP和SIGCONT用于Unix shell中的作业控制,无法捕获或忽略SIGCONT信号。
SIGPIPE 这个是向一个没有读进程的管道写数据产生的错误,这种解释过于官方。在网络编程中这个信号发生在如果客户端已经关闭了套接字, 而服务器调用了一次write,服务器就会收到一个RST segment,如果服务器再次调用write,这个时候就会产生SIGPIPE信号,系统默认的处理方式是关掉这个进程, 但是对于一个高可用的服务器程序来说,需要手动处理这个信号,所以你会看到许多服务器程序代码会在前面显式加上signal (SIGPIPE, SIG_IGN)来忽略这个信号。
SIGCHILD 这个同样是高性能服务器需要关注的信号,如果服务器采用fork产生的子进程推出后要调用wait进行资源回收,防止僵尸进程的产生,但是如果程序对子进程退出后的状态不感兴趣的话可以调用signal(SIGCHLD,SIG_IGN); 交给系统init去回收。子进程也不会产生僵尸进程了。
SIGSEGV 就是SegmentFault 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据,官方举得三个例子是:
- buffer overflow --- usually caused by a pointer reference out of range. 野指针
- stack overflow --- please keep in mind that the default stack size is 8192K. 栈溢出
- illegal file access --- file operations are forbidden on our judge system. 非法文件访问
SIGBUS 指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。试图访问一块无文件内容对应的内存区域,比如超过文件尾的内存区域,或者以前有文件内容对应,现在为另一进程截断过的内存区域。apache爆出的一个bug就是mmap调用的时候文件发生改变就会爆出这个错误,具体参考这篇精彩的博客是 : 由mmap引发的SIGBUS
关于上面两个信号,《UNP》卷二中对于共享内存mmap引发这两个错误的原因用一张图描述:

SIGBUS意味着我们是在内存映射区内访问,但是已超出了底层支撑对象的大小。SIGSEGV则意味着我i们在内存映射区以外访问。
SIGURG I/O紧急信号,也就是tcp传输带外数据时使用,但是tcp手册 RFC6093中已经不建议使用紧急指针了,所以这个信号也就没什么用了。
SIGIO 当描述符上可以进行I/O时产生这个信号,这时五大IO模型中信号驱动IO模型的实现信号。
SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间.alarm函数使用该信号.
以上就是编程中常见到的信号,也是最引人关注的信号,至于其他信号,以后想起再写吧。
2018.6.14 append:
https://www.linuxjournal.com/article/10815 shell 捕获信号
[转]Linux下的常见信号总结的更多相关文章
- linux下的常见信号总结
在linux下有很多信号,按可靠性分为可靠信号和非可靠信号,按时间分为实时信号和非实时信号,linux进程也有三种方式来处理收到的信号: (1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略 ...
- Linux下软件常见安装方式
pasting 分类: Linux2007-12-08 16:31 1909人阅读 评论(0) 收藏 举报 linuxredhat脚本文档managerfile Linux下软件安装主 ...
- Linux下的常见压缩解压缩命令
Linux常见压缩解压缩命令 常见压缩文件扩展名 .Z compress 程序压缩的文件: .zip zip 程序压缩的文件: .gz gzip 程序压缩的文件: .bz2 bzip2 程序压缩的文件 ...
- Linux下各种常见环境变量的配置
Linux系统下各种环境变量都通过修改/etc/profile文件来实现.由于是系统文件,修改此文件需要root权限.因此实现以下功能都需要用户拥有root权限. 另:不要轻易修改profile文 ...
- Linux下Oracle常见安装错误[Z]
#./runInstaller之后出现如下的错误信息: RedHat AS5 x86上安装Oracle1020 Exception in thread "main" java.la ...
- linux下编译常见错误
1.浮点数例外:除数为0 2.已杀死:空间过大 3.已放弃:时间过长 4.段错误:递归 / 循环出不来
- Linux下利用signal函数处理ctrl+c等信号
前言 linux下能够通过信号机制来实现程序的软中断,是一个很实用的编程方法. 我们平时在程序执行的时候按下ctrl-c.ctrl-z或者kill一个进程的时候事实上都等效于向这个进程发送了一个特定信 ...
- Linux环境进程间通信(二): 信号(上)
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
- linux系统编程之信号(一):中断与信号
一,什么是中断? 1.中断的基本概念 中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被 ...
随机推荐
- 史上最全最新Java面试题合集一(附答案)
下面小编整理了本套java面试题全集,分享给大家,希望对大家的java学习和就业面试有所帮助. 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征 ...
- 禁止服务向 eureka 上注册配置文件
### 禁止向注册中心注册服务eureka.client.register-with-eureka=false
- RuntimeError: Model class users.models.UserProfile doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
Django启动的时候报错 File "/home/hehecat/PycharmProjects/MxShop/MxShop/urls.py", line 23, in from ...
- Python之网格搜索与检查验证-5.2
一.网格搜索,在我们不确定超参数的时候,需要通过不断验证超参数,来确定最优的参数值.这个过程就是在不断,搜索最优的参数值,这个过程也就称为网格搜索. 二.检查验证,将准备好的训练数据进行平均拆分,分为 ...
- centos7 GNOME 安装微信客户端
写在前边 最近新装了一个 centos7 GNOME 系统,用了很久了 win,突然转换 linux 桌面版,觉得焕然一新,给搬砖生活增添了一份新意 ~ 先看一下效果图: 怎么弄呢? 下载最新版本 t ...
- node中用的cookie-parser插件设置的max-age,和普通正常设置max-age的计算方式不一样
在cookie-parser中通过max-age设置的cookie的过期时间是按照毫秒计算的; 在普通设置的时候max-age后面的值是按秒计算的;
- Linux下安装php开发环境
先记录下以恶搞教程,回头自己更 https://my.oschina.net/hhly/blog/1547227
- Android NDK 学习之调用Java函数
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
- [LeetCode] 342. 4的幂 ☆(是否4 的幂)
描述 给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方. 示例 1: 输入: 16输出: true示例 2: 输入: 5输出: false 进阶:你能不使用循环或者递归 ...
- [LeetCode] 148. 排序链表 ☆☆☆(归并排序)
148.排序链表 描述 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3输出: 1->2->3-> ...