信号本质

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

产生信号的条件主要有:

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 )收受信号的进程按事先的规定完成对相应事件的处理。

 

LINUX信号机制