(SIGRTMIN + 1
)是否可以安全地进行进程间通信?它会在不同的过程中发生变化吗?
使用sigqueue(2)
或kill(2)
发送标准信号和实时信号有什么不同吗?
如果我使用sigqueue(2)
发送一系列SIGUSR1
(标准信号)并缓慢处理它们,队列中是否有多个SIGUSR1
实例?
如何使用kill(2)
发送SIGRTMIN
(实时信号)?他们会排队吗?
答案 0 :(得分:3)
sigqueue()可用于仅发送实时信号,而kill()可用于仅发送标准信号。我没有尝试用任何API发送错误的信号。但我希望它会因某些适当的错误而失败。 Linux不排队标准信号。实时信号排队。可排队的最大实时信号数定义为 RLIMIT_SIGPENDING
只要接收方具有特定信号发送方正在发送的处理程序设置,您就可以使用任何实时信号。
编辑
我的答案早些时候错了。看起来kill()也可以发送实时信号。但是从__send_signal()中的注释看起来使用kill来发送实时信号在某些情况下可能没有预期效果,即:信号可能不会排队。
/*
* Real-time signals must be queued if sent by sigqueue, or
* some other real-time mechanism. It is implementation
* defined whether kill() does so. We attempt to do so, on
* the principle of least surprise, but since kill is not
* allowed to fail with EAGAIN when low on memory we just
* make sure at least one signal gets delivered and don't
* pass on the info struct.
*/
答案 1 :(得分:0)
此帖是旧闻,但它在谷歌上排名很高,不幸误导,所以这里有一些澄清: