Linux 信号

来源:互联网 发布:淘宝围巾店 编辑:程序博客网 时间:2024/05/23 00:06

最常见的一句话就是“信号是中断机制的一种模拟”。

中断和异常

 

 中 断(也称硬件中断)

定义 :中断是由其他硬件设备依照CPU 时钟周期信号随机产生的。

分类 : 可屏蔽中断

非可屏蔽中断

来源: 间隔定时器和I/O

 

 异 常(也称软件中断)

定义 :当指令执行时由 CPU控制单元 产生的,异常也称为“异步中断”是因为只有在 一条指令终止执行后CPU 才会发出中断。

分类 : 处理器探测到的异常

²  故障

²  陷阱

²  异常终止

编程异常( 也称软中断 )

²  int指令

来源: 程序的错误产生的

内核必须处理的异常( 例如:缺页和内核服务的请求 -int)

异常处理

 当发生异常时,CPU 控制单元产生一个硬件出错码。

 CPU根据该中断吗找到中断向量表内的对应向量,根据该向量转到中断处理程序。

 中断处理程序处理完之后向当前进程发送一个SIG*** 信号。

 若进程定义了相应的信号处理程序则转移到相应的程序执行,若没有,则执行内核定义的操作。

中断处理

 设备产生中断

 PIC(可编程中断控制器)会产生一个对应的中断向量

 和中断向量表中的每一个中断向量进行比较,转到对应的中断处理程序

 中断处理程序进行保存现场,做相关处理,恢复现场

 内核调度,返回用户进程

信号是 异步的进程间通讯机制 ,是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知 道信号到底什么时候到达。 
信号是进程间通信机制中 唯一的异步通信机制, 可以看作是异步通知,通知接收信号的进程有哪些事情发生了。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给 该进程传递任何数据。

 产生信号的条件主要有:

1.  用户在终端 按下某些键时,终端驱动程序会发送信号给前台进程,例如Ctrl-C 产生 SIGINT 信 号, Ctrl-/ 产生 SIGQUIT 信号, Ctrl-Z 产生SIGTSTP 信号。

2.  硬件异常产生信号,这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执行了 除以0 的指令, CPU 的运算单元会产生异常,内核将这个异常解释为 SIGFPE 信号发送给进 程。再比如当前进程访问了非法内存地址,, MMU 会产生异常,内核将这个异常解释为 SIGSEGV 信 号发送给进程。

3.  一个进程调用kill(2) 函数可以发送信 号给另一个进程。

4.  可以用kill(1) 命令发送信号给某个 进程, kill(1) 命令也是调用 kill(2) 函 数实现的,如果不明确指定信号则发送 SIGTERM 信号,该信号的默认处理动作是终止进程。

5.  当 内核检测到某种软件条件发生时也可以通过信号通知进程,例如闹钟超时产生SIGALRM 信 号,向读端已关闭的管道写数据时产生 SIGPIPE 信号。

 进程对信号的处理:

1.  忽略此信号。

2.  执行该信号的默认处 理动作。

3.  提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函 数,这种方式称为捕捉(Catch  一个信号。

 信号与中断的相似点: 
(1 )采用了相同的异步通信方式; 
(2 )当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序; 
(3 )都在处理完毕后返回到原来的断点; 
(4 )对信号或中断都可进行屏蔽。

 信号与中断的区别: 
(1 )中断有优先级,而信号没有优先级,所有的信号都是平等的; 
(2 )信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行; 
(3 )中断响应是及时的,而信号响应通常都有较大的时间延迟。

 信号机制具有以下三方面的功能: 
(1 )发送信号。发送信号的程序用系统调用 kill( ) 实现; 
(2 )预置对信号的处理方式。接收信号的程序用 signal( ) 来实现对处理方式的预置; 
(3 )收受信号的进程按事先的规定完成对相应事件的处理。

内 核给一个进程发送软中断信号的方法,是在进程所在的进程表项的信号域设置对应于该信号的位。这里要补充的是,如果信号发送给一个正在睡眠的进程,那么要看 该进程进入睡眠的优先级,如果进程睡眠在可被中断的优先级上,则唤醒进程;否则仅设置进程表中信号域相应的位,而不唤醒进程。这一点比较重要,因为进程检 查是否收到信号的时机是:一个进程在即将从内核态返回到用户态时;或者,在一个进程要进入或离开一个适当的低调度优先级睡眠状态时。 

内核处理一个进程收到的信号的时机是在一个进程从内核态返回用户态时。所以,当一个进程在内核态下运行时,软中断信号并不立即起作用,要等到将返回用户态时才处理。进程只有处理完信号才会返回用户态,进程在用户态下不会有未处理完的信号。 

内 核处理一个进程收到的软中断信号是在该进程的上下文中,因此,进程必须处于运行状态。前面介绍概念的时候讲过,处理信号有三种类型:进程接收到信号后退 出;进程忽略该信号;进程收到信号后执行用户设定用系统调用signal的函数。当进程接收到一个它忽略的信号时,进程丢弃该信号,就象没有收到该信号似 的继续运行。如果进程收到一个要捕捉的信号,那么进程从内核态返回用户态时执行用户定义的函数。而且执行用户定义的函数的方法很巧妙,内核是在用户栈上创 建一个新的层,该层中将返回地址的值设置成用户定义的处理函数的地址,这样进程从内核返回弹出栈顶时就返回到用户定义的函数处,从函数返回再弹出栈顶时, 才返回原先进入内核的地方。这样做的原因是用户定义的处理函数不能且不允许在内核态下执行(如果用户定义的函数在内核态下运行的话,用户就可以获得任何权 限)。 

注意 信号SIGKILL和SIGSTOP既不能被捕捉,也不能被忽略。

0 0
原创粉丝点击