信号的来源,种类,进程对信号的响应。
信号的捕获,发送,屏蔽。
-------------------------------------------------------------
信号是一种软中断,它提供了一种处理异步事件的方式,也是进程间唯一的异步通信方式。根据POSIX标准扩展以后的信号机制,不仅可以
用来通知进程发生了什么事件,还可以给进程传递数据。
-------------------------------------------------------
信号的来源:
1、硬件方式:
在终端按下某些键时,产生信号。如Ctrl+C将产生SIGINT信号
硬件异常检测信号:除数为0,无效的存储访问等。这些事件通常由硬件(CPU)检测到,并将其通知给操作系统内核,然后由内核生成相应的信号,
并把信号发送给该事件发生时正在运行的程序。
2、软件方式:
在终端下使用kill命令向进程发送任意信号
进程调用kill或sigqueue函数发送信号
当检测到某种软件条件具备时发出信号,如由alarm或settimer设置的定时器超时,将生成SIGALRM信号。
------------------------------------------------------------------
信号的种类:
在终端输入 kill -l 可以显示Linux支持的全部信号。
信号的值定义在:signal.h中
1、可靠信号与不可靠信号:
可靠信号也称为实时信号。
信号的可靠性是指信号是否支持排队。
信号产生后,内核通常会在进程表中设置某种形式的标志。当内核设置了这个标志,我们就是内核向进程递送了一个信号。
信号的产生和递送之间的时间间隔,称为信号未决。
进程可以调用sigpending将信号设置为阻塞,如果为进程产生了一个阻塞的信号,而对该信号的动作是捕捉该信号(即不是忽略信号)
则内核将为该进程的此信号保持为未决信号,直到该进程对此信号解除阻塞或将对此信号的响应更改为忽略。如果在进程解除对某个信号
的阻塞之前,这种信号发生了多次,那么如果如果信号被递送多次(即信号在未决信号队列里面排队),则称之为可靠信号。
只被递送一次的信号成为不可靠信号。
2、信号的优先级:
信号实质上是软中断,中断有优先级,信号也有优先级。如果一个进程有多个未决信号,则对于同一个未决的实时信号,内核将按照发送的顺序来递送信号。如果
存在多个未决的实时信号,则值(或者说编号)越小的越先被递送。如果既存在不可靠信号,又存在实时信号(可靠信号),虽然POSIX对这一情况没有明确规定,
但linux系统和大多数遵循POSIX标准的操作系统一样。将优先递送不可靠信号。
-------------------------------------------------------------------
进程对信号的响应:
1、捕捉信号
对于要捕捉的信号,可以为其指定信号处理函数,信号发生时该函数自动被调用,在该函数内部实现对信号的处理。
2、忽略信号
注意:SIGKILL和SIGSTOP这两个信号不能被忽略,同时这两个信号也不能被捕获和阻塞。此外,如果忽略某些硬件产生的
信号(如非法存储访问或除以0),则进程的行为是不可预测的。
3、按照系统默认方式处理。
大部分信号的默认操作是终止进程,且所有的实时信号的默认动作都是终止进程。