一、阻塞信号

内核信号标志:

  • 当造成信号的事件发生时,为进程产生一个信号(或向一个进程发送一个信号)。事件可以是硬件异常(例如除以 0)、软件条件 (例如,闹钟时间超过)、终端产生的信号或调用kill函数。当一个信号产生时,内核通常在进程表中以某种形式设置一个标志

未决的信号:

  • 当对信号做了这种动作时,我们说向一个进程递送了一个信号。 在信号产生(generation)和递送(delivery)之间的时间间隔内,称信号未决(pending)

阻塞信号

如果为进程产生了一个阻塞的信号:

  • 如果对该信号的动作是系统默认动作或捕捉该信号:则为该进程将此信号保持为未决状态,直到该进程对此信号解除了阻塞。或者将对此信号的动作更改为忽略
  • 当递送一个原来被阻塞的信号给进程时,而不是在产生该信号时,内核才决定对它的处理方式。于是进程在信号递送给它之前仍可改变对它的动作

信号排队

  • 当一种信号类型处于阻塞期间时,产生了多个相同的信号,那么这个类型的信号变为非阻塞时,只向进程发送一次 

APUE编程:78---信号处理(阻塞信号、信号屏蔽字)_非阻塞

APUE编程:78---信号处理(阻塞信号、信号屏蔽字)_非阻塞_02

二、信号屏蔽字
  • 每个进程都有一个信号屏蔽字(signal mask),它包含了当前要阻塞递送到该进程的信号集
  • 对于每种可能的信号,该屏蔽字中都有一位与之对应。对于某种信号,如果想要阻塞它,就设置信号屏蔽字对应的位
  • 进程可以调用sigprocmak来检测和更改其当前信号屏蔽字
  • 通过sigpending检测信号屏蔽字