我正在阅读信号的手册页 man 7 signal我看到两种类型的信号。所以,我有疑问,
Linux中 POSIX可靠信号和 POSIX实时信号有什么区别?
答案 0 :(得分:5)
现在,将这些短语称为普通信号语义与实时信号语义可能更好。
在一些早期的UNIX系统中,信号不可靠,因为它们可能会“丢失”,因为没有阻止信号的功能(使它们保持挂起状态)。例如,如果信号在检查后但在之前到达,则在检查信号处理程序设置的wake_up_flag
之后调用 pause()的代码可能会错过唤醒指令暂停()的。信号阻塞和sigpause()是对这种情况的可靠改进。
此外, signal()的语义意味着用户定义的信号处理程序在进入处理程序时被重置为SIG_DFL。通常的技术是立即在信号处理程序中重新安装用户定义的处置。但是,由于无法阻止信号,这意味着存在竞争条件,其中程序可能再次发出信号并遭受SIG_DFL的后果。在现代系统中,sigaction()可靠地解决了这种情况。
因此,“可靠”信号是我们大多数人现在认为的普通信号语义。 (有关更多信息,请参阅Stephens和Rago的 UNIX环境中的高级编程,特别是§10.4“不可靠的信号”)
POSIX realtime signals在普通信号上添加一些功能,例如,用于应用目的的新信号范围(SIGRTMIN ... SIGRTMAX),将待处理信号排队的能力以及传送单词的能力带信号的数据。