【发布时间】:2016-10-23 18:52:01
【问题描述】:
如何使用 sigaction 以便进程可以发送带有信号的有效负载,该信号可以由接收进程检索?
【问题讨论】:
标签: c linux operating-system
如何使用 sigaction 以便进程可以发送带有信号的有效负载,该信号可以由接收进程检索?
【问题讨论】:
标签: c linux operating-system
您使用实时信号(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 中,您可以使用value.sival_ptr = (void *)(unsigned long)yourval; 发送完整的long 或unsigned long。)
(在 Linux 中,sizeof (long) == sizeof (void *),因此您实际上可以发送 CHAR_BIT*sizeof (long) 位信息;这是 32 位架构中的 32 位和 64 位架构中的 64 位。)
处理程序可以通过检查info->si_code == SI_QUEUE 来确定是否使用sigqueue() 发送了信号。然后有效载荷可用
在info->si_value 联合。请注意,您无法知道发送者发送的是指针还是 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 之类的信号来告诉服务守护进程重新加载其配置或退出;因此,对于类似的管理目的,以及对于信息(而不是关键)消息,使用信号及其有效负载是可以的。
【讨论】:
信号不用于在进程之间传递过多的数据。考虑另一种 IPC 机制,如管道、套接字等。
或者,您也可以结合使用它们。例如。在进程之间共享管道的两端,然后在进程A中向它写入一些东西,然后向进程B发送信号。将信号传递给进程B被视为准备从管道读取,然后进程B只是从a读取数据管道,由 A 编写。
【讨论】: