如何使用sigaction,以便进程可以发送带有接收进程可以检索的信号的有效负载?
答案 0 :(得分:1)
您使用实时信号(SIGRTMIN+0
至SIGRTMAX-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}发送完整的long
或unsigned 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_t
和si_int
引用完全相同的si_value.sival_int
,int
和si_ptr
引用完全相同si_value.sival_ptr
。还有一些额外的名字"对于这些字段的向后兼容性,这就是全部。
请记住,在高负载时,即使是实时信号也可能丢失。但是,我们经常使用ptr
或HUP
等信号来告诉服务守护进程重新加载其配置或退出;因此,出于类似的管理目的,以及信息(而非关键)消息,使用信号及其有效载荷是可以的。
答案 1 :(得分:0)
信号不适用于在进程之间传递过多数据。考虑另一种IPC机制,如管道,插座等。
或者您可以将它们结合使用。例如。在进程之间共享一个管道的两端,然后在进程A中向它写入一些内容,然后向进程B发送信号。向进程B发送信号被视为准备从管道读取,然后进程B只读取来自进程的数据管道,由A写的。