【Linux】信号机制
来源:互联网 发布:淘宝威客平台 编辑:程序博客网 时间:2024/06/13 17:39
在Linux中,信号是进程间通讯的一种方式,它采用的是异步机制。当信号发送到某个进程中时,操作系统会中断该进程的正常流程,并进入相应的信号处理函数执行操作,完成后再回到中断的地方继续执行。
需要说明的是,信号只是用于通知进程发生了某个事件,除了信号本身的信息之外,并不具备传递用户数据的功能。
1 信号的响应动作
每个信号都有自己的响应动作,当接收到信号时,进程会根据信号的响应动作执行相应的操作,信号的响应动作有以下几种:
- 中止进程(Term)
- 忽略信号(Ign)
- 中止进程并保存内存信息(Core)
- 停止进程(Stop)
- 继续运行进程(Cont)
用户可以通过signal
或sigaction
函数修改信号的响应动作(也就是常说的“注册信号”,在文章的后面会举例说明)。另外,在多线程中,各线程的信号响应动作都是相同的,不能对某个线程设置独立的响应动作。
2 信号类型
Linux支持的信号类型可以参考下面给出的列表。
2.1 在POSIX.1-1990标准中的信号列表
注:其中SIGKILL
和SIGSTOP
信号不能被捕获、阻塞或忽略。
2.2 在SUSv2和POSIX.1-2001标准中的信号列表
注:在Linux 2.2版本之前,SIGSYS
、SIGXCPU
、SIGXFSZ
以及SIGBUS
的默认响应动作为Term,Linux 2.4版本之后这三个信号的默认响应动作改为Core。
2.3 其它信号
注意:列表中有的信号有三个值,这是因为部分信号的值和CPU架构有关,这些信号的值在不同架构的CPU中是不同的,三个值的排列顺序为:1,Alpha/Sparc;2,x86/ARM/Others;3,MIPS。
例如SIGSTOP
这个信号,它有三种可能的值,分别是17、19、23,其中第一个值(17)是用在Alpha和Sparc架构中,第二个值(19)用在x86、ARM等其它架构中,第三个值(23)则是用在MIPS架构中的。
3 信号机制
文章的前面提到过,信号是异步的,这就涉及信号何时接收、何时处理的问题。
我们知道,函数运行在用户态,当遇到系统调用、中断或是异常的情况时,程序会进入内核态。信号涉及到了这两种状态之间的转换,过程可以先看一下下面的示意图:
接下来围绕示意图,将信号分成接收、检测和处理三个部分,逐一讲解每一步的处理流程。
3.1 信号的接收
接收信号的任务是由内核代理的,当内核接收到信号后,会将其放到对应进程的信号队列中,同时向进程发送一个中断,使其陷入内核态。
注意,此时信号还只是在队列中,对进程来说暂时是不知道有信号到来的。
3.2 信号的检测
进程陷入内核态后,有两种场景会对信号进行检测:
- 进程从内核态返回到用户态前进行信号检测
- 进程在内核态中,从睡眠状态被唤醒的时候进行信号检测
当发现有新信号时,便会进入下一步,信号的处理。
3.3 信号的处理
信号处理函数是运行在用户态的,调用处理函数前,内核会将当前内核栈的内容备份拷贝到用户栈上,并且修改指令寄存器(eip)将其指向信号处理函数。
接下来进程返回到用户态中,执行相应的信号处理函数。
信号处理函数执行完成后,还需要返回内核态,检查是否还有其它信号未处理。如果所有信号都处理完成,就会将内核栈恢复(从用户栈的备份拷贝回来),同时恢复指令寄存器(eip)将其指向中断前的运行位置,最后回到用户态继续执行进程。
至此,一个完整的信号处理流程便结束了,如果同时有多个信号到达,上面的处理流程会在第2步和第3步骤间重复进行。
重点理解上图三个部分:信号检测/信号调用/信号处理程序返回。明白怎么从正常进程到信号处理程序再到正常进程的过程。
- linux信号机制
- linux信号机制signal
- Linux信号机制分析
- Linux的信号机制
- Linux信号处理机制
- linux信号机制简介
- linux 信号机制、生命
- linux信号处理机制
- linux的信号机制
- Linux信号机制概述
- Linux 信号机制分析
- Linux Signal 信号机制
- Linux 信号处理机制
- linux 信号处理机制
- Linux信号机制分析
- linux信号的机制
- LINUX 信号机制
- Linux 信号机制
- camera shake 相机抖动
- 配置IP & 虚拟机网络排查
- 我的编码习惯
- 多线程
- EularProject 61:Cyclical figurate numbers
- 【Linux】信号机制
- ubuntu14.04+kinectv1+orbslam2安装
- React Native 控件封装
- 训练集、验证集和测试集的意义
- pandas 使用apply同时处理两列数据
- 所有设备都不安全 只要连WiFi 就会被入侵
- python乱码解决以及sys编码格式
- 【GitHub】使用Eclipse提交代码到github
- oj网站的训练题:统计字符