关于linux信号的一些问题

时间:2012-03-14 05:59:48

标签: linux signals

  1. SIGRTMIN + 1)是否可以安全地进行进程间通信?它会在不同的过程中发生变化吗?

  2. 使用sigqueue(2)kill(2)发送标准信号和实时信号有什么不同吗?
    如果我使用sigqueue(2)发送一系列SIGUSR1(标准信号)并缓慢处理它们,队列中是否有多个SIGUSR1实例? 如何使用kill(2)发送SIGRTMIN(实时信号)?他们会排队吗?

2 个答案:

答案 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)

此帖是旧闻,但它在谷歌上排名很高,不幸误导,所以这里有一些澄清:

  1. 可以使用任何这些功能发送任何信号
  2. sigqueue可以传递更多" context" [例如。信息,@ see siginfo et。 al],而不是kill / raise
  3. 根据实时信号 - 如果它们被发送或排队并不重要 - 它们的行为相同[例如排队比照与非RT信号分组]