2016-03-07 118 views
0

书“高级编程在Unix环境”说:信号队列和信号屏蔽

内核,除非他们支持实时扩展到POSIX.1

如果不排队信号被阻塞的信号不止一次产生(产生的阻塞信号是不同类型的),它被设置在信号掩码上。然后,在其他信号之前传送与当前进程状态相关的信号。

这里,信号队列和信号掩码有什么不同? 如果为每种不同类型设置信号掩码,这意味着内核知道什么信号正在等待(因此,我认为队列和掩码相同)。

而且,传送信号一次?当同一类型的信号被多次传送时,是不是这样?另外,大多数UNIX系统不排队信号意味着只有1个信号掩码位可以在清除掩码上设置?那么,如果在这个过程中阻塞了不同类型的许多信号会发生什么?什么信号没有设置?

+0

没有队列。信号有待处理或未处理。一点。如果有一个队列,可以在其中放入5个SIGINT实例,这与6或17个实例不同。 –

+0

只能打开一个掩码位? –

+0

不,可以打开几个位。 –

回答

1

Signal Mask: 当前被收集的信号被封锁被称为信号掩码。一个进程可以设置一个信号掩码来告诉内核它不想接收某些特定的信号。因此,发送其中一个阻塞信号意味着相应的信号处理程序不会被调用。 SIGKILLSIGSTOP信号不能被阻止。

Signal Queue:每个进程维护一个已接收但尚未处理的信号队列。已使用掩码阻止的信号将排队等候。该过程可以通过sigwait(),sigwaitinfo()和类似功能访问此队列。