如今,最好将它们表述为普通信号语义而不是实时信号语义。
在某些早期的UNIX系统中,信号是不可靠的,因为它们可能会“丢失”,因为没有阻止信号的功能(使信号处于未决状态)。例如,如果信号刚好在检查之后但在pause()之前到达,则在由信号处理程序检查设置后要调用pause()的代码wake_up_flag可能会错过唤醒指令。信号阻塞和sigpause()是对这种情况的可靠改进。
另外,signal()的语义意味着用户定义的信号处理程序在进入处理程序后将重置为SIG_DFL。因此,通常的技术是立即将用户定义的处置方式重新安装在信号处理器内。但是,由于无法阻止信号,这意味着在竞争状态下,可能会再次发信号通知程序并遭受SIG_DFL的后果。在现代系统中,sigaction()可靠地解决了这种情况。
因此,“可靠的”信号是当今我们大多数人所认为的普通信号语义。(有关更多信息,我建议使用Stephens和Rago 的《 UNIX环境中的高级编程》,特别是第10.4节“不可靠的信号”)
POSIX实时信号在普通信号上增加了一些功能,例如,用于应用目的的新信号范围(SIGRTMIN ... SIGRTMAX),将待处理信号排队的能力以及用信号传递数据字的能力。
| 归档时间: |
|
| 查看次数: |
1042 次 |
| 最近记录: |