使用sigaction发送有效负载

时间:2016-10-23 18:52:02

标签: c linux operating-system

如何使用sigaction,以便进程可以发送带有接收进程可以检索的信号的有效负载?

2 个答案:

答案 0 :(得分:1)

您使用实时信号(SIGRTMIN+0SIGRTMAX-0),以便信号排队,并且您丢失信号的可能性要小得多。 (标准信号不排队,因此如果几乎同时发送两个信号,则实际只传送其中一个信号。)

使用sigaction()安装处理程序时,使用SA_SIGINFO标志,以便处理程序的签名为

void signal_handler(int signum, siginfo_t *info, void *context)

使用sigqueue()发送信号时,第三个参数是指针或int,存储在类型为union sigval的联合中。 (对于union sigval value,int为value.sival_int,指针为value.sival_ptr。在Linux中,您可以使用{{1}发送完整的longunsigned long }}。)

(在Linux中,value.sival_ptr = (void *)(unsigned long)yourval;,因此您实际上可以发送sizeof (long) == sizeof (void *)位信息;在32位体系结构中为32位,在64位体系结构中为64位。)

处理程序可以通过检查CHAR_BIT*sizeof (long)来确定是否使用sigqueue()发送了信号。然后有效载荷可用 在info->si_code == SI_QUEUE联盟。请注意,您无法知道发件人是否发送了指针或int,您需要事先知道。 sigaction()手册页介绍了所有字段,包括info->si_value

不要对si_code->si_int->si_ptr感到困惑。定义->si_value结构,以便成员siginfo_tsi_int引用完全相同的si_value.sival_intintsi_ptr引用完全相同si_value.sival_ptr。还有一些额外的名字"对于这些字段的向后兼容性,这就是全部。

请记住,在高负载时,即使是实时信号也可能丢失。但是,我们经常使用ptrHUP等信号来告诉服务守护进程重新加载其配置或退出;因此,出于类似的管理目的,以及信息(而非关键)消息,使用信号及其有效载荷是可以的。

答案 1 :(得分:0)

信号不适用于在进程之间传递过多数据。考虑另一种IPC机制,如管道,插座等。

或者您可以将它们结合使用。例如。在进程之间共享一个管道的两端,然后在进程A中向它写入一些内容,然后向进程B发送信号。向进程B发送信号被视为准备从管道读取,然后进程B只读取来自进程的数据管道,由A写的。