关于linux信号的几个问题

关于linux信号的几个问题,linux,signals,Linux,Signals,进程间通信(SIGRTMIN+1)安全吗?它会在不同的过程中发生变化吗 使用sigqueue(2)或kill(2)发送标准信号和实时信号有什么区别吗? 如果我使用sigqueue(2)发送一系列SIGUSR1(标准信号)并缓慢处理,队列中是否有多个SIGUSR1实例? 使用kill(2)发送SIGRTMIN(实时信号)怎么样?他们会排队吗 sigqueue()只能用于发送实时信号,kill()只能用于发送标准信号。我没有尝试用这两种API发送错误的信号。但我预计它会以某种适当的错误而失败。Lin

进程间通信(
SIGRTMIN+1
)安全吗?它会在不同的过程中发生变化吗

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

  • sigqueue()只能用于发送实时信号,kill()只能用于发送标准信号。我没有尝试用这两种API发送错误的信号。但我预计它会以某种适当的错误而失败。Linux不将标准信号排队。实时信号排队。可排队的最大实时信号数定义为RLIMIT\u 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.
         */
    

    这篇文章是老新闻,但它在谷歌上排名很高,不幸具有误导性,因此这里有一些澄清:

  • 你可以用这些功能中的任何一个发送任何信号
  • sigqueue允许传递更多的“上下文”[例如,信息,参见siginfo等人],而不是kill/raise
  • 根据实时信号-无论是发送还是排队-它们的行为都相同[例如,排队cf与非RT信号分组]

  • 是通过经验,通过阅读内核源代码,还是通过阅读Posix规范?如果您有一些源,共享它们会很有趣……但事实是
    kill(2)
    sigqueue(2)
    都可以发送任何信号而不会出现故障。我写了一个小测试来证明它们有效。但我不知道如何在评论中发布源代码。