我可以确定使用 pthread_kill 发送实时信号总是会成功吗?

问题描述 投票:0回答:1

上下文...

查看 posix 信号和两种传递机制:一种 flag 机制,然后处理原始或标准信号,以及一种队列机制,用于处理 extend,又称实时信号。

所以我知道(或假设)在传递标准信号和有效线程作为参数时对 pthread_kill 的调用总是会成功。

相比之下,当信号队列已满时,在传递有效且可到达的进程 ID 以及有效信号和值作为参数时对 sigqueue 的调用将失败并返回 EAGAIN 错误.

忽略前一个函数指向线程,后一个函数指向进程:这里的重点在于交付保证

疑问...

我想知道的是:使用 pthread_kill 发送实时信号时我能期待什么?因为一旦接口没有指定 EAGAIN 作为可能的错误,那么如果盲目地基于接口规范(正如我在手册页中看到的那样),我可以假设调用总是会成功。

这是对的吗?或者有什么我没有看到的问题?

到目前为止,在我看到的文档或问题中,我找不到明确的答案。

c signals posix
1个回答
0
投票

我想知道的是:使用 pthread_kill 发送时我能期待什么 实时信号?

目前尚不清楚您是否可以做到这一点,部分取决于您所说的“发送实时信号”的含义。特别是,虽然POSIX确实将特殊的交付顺序语义归因于

SIGRTMIN
SIGRTMAX
之间的信号编号(包含),但似乎not说该范围内的信号会自动排队。超出该范围的信号也不会排队。相反,它将信号排队与发出信号的方式联系起来:

一些信号生成函数,例如高分辨率计时器到期、异步 I/O 完成、进程间消息到达和

sigqueue()
函数,支持应用程序定义值的规范 [...] 当
sigqueue()
函数或任何支持应用程序定义值规范的信号生成函数生成信号时,该信号应标记为待处理,并且如果为该信号设置了 SA_SIGINFO 标志,则该信号应为与应用程序指定的信号值一起排队到进程中。 [...] 当未为该信号设置 SA_SIGINFO 标志时,未指定如此生成的信号是否排队。

因此,如果“发送实时信号”的意思是“导致信号排队等待传递”,那么我认为

pthread_kill()
不具有该功能。至少,POSIX 没有明确指出它是这样的。另一方面,如果您的意思是“发送范围内的信号
SIGRTMIN
...
SIGRTMAX
”,那么 POSIX 并不表示该信号必须排队,而不是像任何其他信号一样传递,甚至是
 pthread_kill()
将会发送它(就规范而言,它可能会因
EINVAL
而失败)。

因为一旦接口没有指定EAGAIN 作为一个可能的错误,那么如果盲目的基于接口 规范(正如我在手册页中看到的那样),我可以假设 通话总会成功。

这是对的吗?或者有什么我没有看到的问题?

不,这似乎不对。 POSIX 不要求

pthread_kill()
发送
SIGRTMIN
...
SIGRTMAX
范围内的信号。它可能会失败并显示
EINVAL
。如果它确实发送了它们,那么 POSIX 不需要它对它们进行排队

© www.soinside.com 2019 - 2024. All rights reserved.