LINUX信号机制
l 信号本质
信号是 异步的进程间通讯机制 ,是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知 道信号到底什么时候到达。
信号是进程间通信机制中 唯一的异步通信机制, 可以看作是异步通知,通知接收信号的进程有哪些事情发生了。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给 该进程传递任何数据。
l 产生信号的条件主要有:
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 信号。
l 进程对信号的处理:
1. 忽略此信号。
2. 执行该信号的默认处 理动作。
3. 提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函 数,这种方式称为捕捉(Catch ) 一个信号。
l 信号与中断的相似点:
(1 )采用了相同的异步通信方式;
(2 )当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;
(3 )都在处理完毕后返回到原来的断点;
(4 )对信号或中断都可进行屏蔽。
l 信号与中断的区别:
(1 )中断有优先级,而信号没有优先级,所有的信号都是平等的;
(2 )信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;
(3 )中断响应是及时的,而信号响应通常都有较大的时间延迟。
l 信号机制具有以下三方面的功能:
(1 )发送信号。发送信号的程序用系统调用 kill( ) 实现;
(2 )预置对信号的处理方式。接收信号的程序用 signal( ) 来实现对处理方式的预置;
(3 )收受信号的进程按事先的规定完成对相应事件的处理。
转载于:https://blog.51cto.com/littlemeng/1182910