写在前面
在刚接触信号时,感觉是:由于信号是异步事件,无法控制何时会发生,所以早期的信号存在是否可重入的问题:异步信号安全。详细的,有可能信号发生时,进程正常执行的指令被中断。对于一些指令,如malloc分配存储空间时,malloc会为存储区维护一个链表,此时信号发生,进入到信号处理程序,再返回,有可能链表已被修改,分配存储空间出错,所以有些函数是不可重入的
早期的信号有时是不可靠的,比如使用一个标志判断信号是否发生,一直循环判断这个标志,直到信号处理程序更改。但在判断之后,很有可能此时信号发生,而进程更改标志后,主程序已经在判断语句之后。从这种意义上说,刚发生的信号就丢失了。
这是早期信号的弊端,在刚接触时,感觉这里一头雾水,摸不到头脑。前面基本上是信号的发展史以及改进。等读到后面的时候就是真正的信号应用,所以,不要被目前的小困难打倒~以下是正题
一、信号的基本术语
信号是软件中断,是一种典型的异步事件处理。信号都是正整数,没有编号为0的信号。以下是信号的基本术语。
产生:当造成信号的事件发生时,此时为进程产生一个信号。
产生信号事件:硬件异常(如除以0)、软件条件(如alarm定时器超时)、终端产生的信号、调用kill函数
递送:当进程对信号处理时,即为向进程递送了一个信号。一般处理方式有3种:忽略此信号、捕捉信号(调用用户函数)、系统默认动作
未决:在信号产生和进程处理之间,一直是未决的。
阻塞:是指递送时阻塞,信号被产生之后,不能及时递送给进程,一直处于未决状态,直到进程解除该信号的阻塞,或者将该信号动作更改为默认。当一个信号被递送时,即进入信号处理程序,系统自动将该信号加入屏蔽字,防止在此期间,后产生相同的信号重新进入信号处理程序。
信号排队:当信号被阻塞时,有可能发生了多个信号。解除阻塞后,POSIX允许系统递送该信号一次或多次。如果递送多次,则称为信号排队。除了信号实施扩展,大部分UNIX不对信号排队,只递送一次信号。
递送顺序:如果有多个信号发送给进程?那怎么确定信号递送顺序呢?POSIX并没有规定,建议优先递送与进程当前状态有关的信号,如SIGSEGV。
信号屏蔽字:每个进程都有一个信号屏蔽字,规定当前要阻塞递送给该进程的信号集。对于每一个可能的信号,屏蔽字有一位与其对应。当对应位设置,表明该信号被屏蔽。
信号集:表示多个信号的数据类型。