2012-03-14 49 views
3
  1. 是否(SIGRTMIN + 1)对于进程间通信是安全的?它会在不同的过程中改变吗?有关linux信号的一些问题

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

回答

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. 
    */ 
+0

是通过阅读内核源代码的经验,还是通过阅读Posix规范?如果你有一些消息来源,分享它们会很有趣...... – 2012-03-14 14:51:49

+1

但是事实是'kill(2)'和'sigqueue(2)'可以发送任何信号而不会失败。我写了一个小测试来证明他们的工作。但我不知道如何在评论中发布源代码。 – majie 2012-03-15 03:11:27

0

这篇文章是旧闻,但它在谷歌排名高的,而且不幸的是误导所以这里有一些澄清:

  1. 一个可以发送任何信号与任何这些功能
  2. sigqueue使通过一些更多的“背景”[例如信息,请参阅siginfo等。 al],而不是杀死/提高
  3. 根据实时信号 - 无论它们是发送还是排队 - 它们的行为都是相同的[例如,排队参阅与非RT信号一起分组]