在Linux中,POSIX可靠信号和POSIX实时信号之间有什么区别?

msc*_*msc 4 linux posix signals real-time

我使用 man 7信号读取了信号的手册页,其中看到了两种信号。所以,我有一个问题,

在Linux中,POSIX可靠信号POSIX实时信号之间有什么区别?

pil*_*row 5

如今,最好将它们表述为普通信号语义而不是实时信号语义。

在某些早期的UNIX系统中,信号是不可靠的,因为它们可能会“丢失”,因为没有阻止信号的功能(使信号处于未决状态)。例如,如果信号刚好在检查之后但在pause()之前到达,则在由信号处理程序检查设置后要调用pause()的代码wake_up_flag可能会错过唤醒指令。信号阻塞和sigpause()是对这种情况的可靠改进。

另外,signal()的语义意味着用户定义的信号处理程序在进入处理程序后将重置为SIG_DFL。因此,通常的技术是立即将用户定义的处置方式重新安装在信号处理器内。但是,由于无法阻止信号,这意味着在竞争状态下,可能会再次发信号通知程序并遭受SIG_DFL的后果。在现代系统中,sigaction()可靠地解决了这种情况。

因此,“可靠的”信号是当今我们大多数人所认为的普通信号语义。(有关更多信息,我建议使用Stephens和Rago 的《 UNIX环境中的高级编程》,特别是第10.4节“不可靠的信号”)

POSIX实时信号在普通信号上增加了一些功能,例如,用于应用目的的新信号范围(SIGRTMIN ... SIGRTMAX),将待处理信号排队的能力以及用信号传递数据字的能力。