上下文...
查看 posix 信号和两种传递机制:一种 flag 机制,然后处理原始或标准信号,以及一种队列机制,用于处理 extend,又称实时信号。
所以我知道(或假设)在传递标准信号和有效线程作为参数时对 pthread_kill 的调用总是会成功。
相比之下,当信号队列已满时,在传递有效且可到达的进程 ID 以及有效信号和值作为参数时对 sigqueue 的调用将失败并返回 EAGAIN 错误.
忽略前一个函数指向线程,后一个函数指向进程:这里的重点在于交付保证。
疑问...
我想知道的是:使用 pthread_kill 发送实时信号时我能期待什么?因为一旦接口没有指定 EAGAIN 作为可能的错误,那么如果盲目地基于接口规范(正如我在手册页中看到的那样),我可以假设调用总是会成功。
这是对的吗?或者有什么我没有看到的问题?
到目前为止,在我看到的文档或问题中,我找不到明确的答案。
我想知道的是:使用 pthread_kill 发送时我能期待什么 实时信号?
目前尚不清楚您是否可以做到这一点,部分取决于您所说的“发送实时信号”的含义。特别是,虽然POSIX确实将特殊的交付顺序语义归因于
SIGRTMIN
和SIGRTMAX
之间的信号编号(包含),但似乎not说该范围内的信号会自动排队。超出该范围的信号也不会排队。相反,它将信号排队与发出信号的方式联系起来:
一些信号生成函数,例如高分辨率计时器到期、异步 I/O 完成、进程间消息到达和
函数,支持应用程序定义值的规范 [...] 当sigqueue()
函数或任何支持应用程序定义值规范的信号生成函数生成信号时,该信号应标记为待处理,并且如果为该信号设置了 SA_SIGINFO 标志,则该信号应为与应用程序指定的信号值一起排队到进程中。 [...] 当未为该信号设置 SA_SIGINFO 标志时,未指定如此生成的信号是否排队。sigqueue()
因此,如果“发送实时信号”的意思是“导致信号排队等待传递”,那么我认为
pthread_kill()
不具有该功能。至少,POSIX 没有明确指出它是这样的。另一方面,如果您的意思是“发送范围内的信号 SIGRTMIN
... SIGRTMAX
”,那么 POSIX 并不表示该信号必须排队,而不是像任何其他信号一样传递,甚至是 pthread_kill()
将会发送它(就规范而言,它可能会因 EINVAL
而失败)。
因为一旦接口没有指定EAGAIN 作为一个可能的错误,那么如果盲目的基于接口 规范(正如我在手册页中看到的那样),我可以假设 通话总会成功。
这是对的吗?或者有什么我没有看到的问题?
不,这似乎不对。 POSIX 不要求
pthread_kill()
发送 SIGRTMIN
... SIGRTMAX
范围内的信号。它可能会失败并显示 EINVAL
。如果它确实发送了它们,那么 POSIX 不需要它对它们进行排队。