信号

来源:互联网 发布:电脑自动拨号软件 编辑:程序博客网 时间:2024/04/30 11:23

首先需要明确三个概念:信号的产生,信号的递送,信号未决

信号的产生(generation):当引发信号的事件发生时,为进程产生一个信号(或向进程发送一个信号)。事件可以是:硬件异常,软件条件,终端产生的信号,调用kill函数

信号的递送(delivery):产生信号时,内核通常(注意是通常,不是所有情况,设置屏蔽位之后就不是了在进程表中设置一个某种形式的标志。采取这种动作时,我们说进程递送了一个信号。

信号未决(pending):在信号产生和递送之间的时间间隔内,称信号是未决的。


1。通常情况下,信号产生之后就马上递送。什么情况会出现未决状态呢?

进程可以将信号阻塞。当某信号被阻塞后,如果为该进程产生一个该信号,并且对该信号的动作是系统默认动作或者捕捉该信号,那么该进程将此信号保持为未决状态。

2。什么时候未决状态终止?

a).对此信号解除了阻塞。

b).将此信号的动作改为忽略。

内核在递送一个原来被阻塞的信号给进程时,才决定对它的处理方式。于是进程可以在信号递送给它之前修改对该信号的动作。

函数sigpending:判定哪些信号是设置为阻塞并处于未决状态。


如果在进程解除对某个信号的阻塞之前,这种信号发生了多次,那将如何处理?一般的系统,只递送这种信号一次。

如果有多个信号递送给一个进程,又将如何处理?POSIX.1没有规定这些信号的递送顺序。但是它建议:在其它信号之前递送与进程当前状态有关的信号,例如SIGSEGV。


如何阻塞信号?

每个进程都一个信号屏蔽字,它规定了当前要阻塞的信号集。对于每种可能的信号,该屏蔽字都有一位与之对应。进程可以调用函数sigprocmask来更改当前信号pingbizi.




本文部分来源APUE10.8节:可靠信号术语和语义