一、简介
1、信号是软件中断,信号提供了一种处理异步事件的方法。
2、每个信号都有一个名字,这些名字都是以SIG开头:
SIGABRT 夭折信号,当进程调用abort函数时产生这种信号
SIGALRM 闹钟信号,当由alarm函数设置的时间已经超过后产生此信号
3、SVR4和4.3+BSD均有31种不同的信号。
4、在头文件<signal.h>中,这些信号都被定义为正整数。
5、可以要求系统在某个信号出现时按照下列三种方式中的一种进行操作:
a、忽略此信号
b、捕捉信号
c、执行系统默认动作
二、应用
1、Unix信号机制最简单的界面是signal函数,可以由此指定信号处理事件函数。
2、当一个进程调用fork时,其子进程继承父进程的信号处理方式。
3、kill函数将信号发送给进程或进程组
4、raise函数则允许进程向自身发送信号
5、使用alarm函数可以设置一个时间值,在将来的某个时刻该时间值会被超过。当所设置的时间值被超过后,产生SIGALRM信号。
如果不忽略或不捕捉此信号,则其默认动作是终止该进程。
6、pause函数使调用进程挂起直至捕捉到一个信号。
7、可以通过alarm和pause函数实现一个简单的sleep函数。(当然实际的sleep函数在此基础上有更进一步的考虑)
static void sig_alrm(int signo) { return; } unsigned int sleep1(unsigned int nsecs) { if (signal(SIGALRM, sig_alrm) == SIG_ERR) return (nsecs); alarm(nsecs); pause(); return( alarm(0)); }
8、sleep函数,此函数使调用进程被挂起直到:
a、已经过了seconds所指定的墙上时钟时间,或者
b、该进程捕捉到一个信号并从信号处理程序返回
三、可靠信号术语和语义
1、首先,当造成信号的事件发生时,为进程产生一个信号。事件可以是硬件异常、软件条件、终端产生的信号或调用kill函数。在
产生了信号时,内核通常在进程表中设置某种形式的一个标志。当对信号做了这种动作时,我们说向一个进程递送了一个信号。
2、在信号产生(generation)和递送(delivery)之间的时间间隔内,称信号未决(pending)
3、如果为进程产生了一个选择为阻塞的信号,而且对该信号的动作时系统默认动作或捕捉该信号,则为该进程将此信号保持为pending
状态,直到该进程对此信号解除了阻塞,或者将对此信号的动作更改为忽略。
4、当递送一个原来被阻塞的信号给进程时,而不是在产生该信号时,内核才决定对它的处理方式。于是进程在信号递送给它之前仍可以改变
对它的动作。
5、每个进程都有一个信号屏蔽字,它规定了当前要阻塞递送到该进程的信号集。
四、信号集
1、使用下列五个函数处理信号集的函数
sigemptyset
sigfillset
sigaddset
sigdelset
sigismember
2、调用sigprocmask函数可以检测或更改进程的信号屏蔽字
3、sigpending函数返回对于调用进程被阻塞不能递送和当前未决的信号集。
4、sigaction函数的功能是检查或修改与指定信号相关联的处理动作。此函数取代了UNIX早期版本使用的signal函数。
五、总结
信号用于很多复杂的应用程序中。理解进行信号处理的原因和方式对于高级Unix程序设计极其重要。