如何使用 sigaction 以便进程可以发送带有可由接收进程检索的信号的有效负载?
最佳答案
您使用实时信号(SIGRTMIN+0
到 SIGRTMAX-0
),因此信号会排队,并且丢失信号的可能性会小得多。 (标准信号没有排队,因此如果几乎同时发送两个信号,则实际上只有其中一个被传送。)
使用sigaction()
安装处理程序时,使用SA_SIGINFO
标志,以便处理程序的签名为
void signal_handler(int signum, siginfo_t *info, void *context)
当使用 sigqueue()
发送信号时,第三个参数是一个指针或一个int,存储在union sigval
类型的 union 体中。 (对于union sigval value
,int为value.sival_int
,指针为value.sival_ptr
。在Linux中,您可以发送完整的long
或 unsigned long
使用 value.sival_ptr = (void *)(unsigned long)yourval;
.)
(在 Linux 中,sizeof (long) == sizeof (void *)
,因此您实际上可以发送 CHAR_BIT*sizeof (long)
位信息;这是32 位架构中为 32 个,64 位架构中为 64 个。)
处理程序可以通过检查 info->si_code == SI_QUEUE
来确定信号是否是使用 sigqueue()
发送的。然后有效负载就可用了
在 info->si_value
union 中。请注意,您无法知道发送者发送的是指针还是 int,您需要事先知道。 sigaction()
手册页描述了所有字段,包括 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
或 TERM
等信号来告诉服务守护进程重新加载其配置或退出;因此,出于类似的管理目的,以及对于信息性(而不是关键性)消息,使用信号及其有效负载是可以的。
关于c - 使用 sigaction 发送有效负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40206629/