c - 使用 sigaction 发送有效负载

标签 c linux operating-system

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

最佳答案

您使用实时信号(SIGRTMIN+0SIGRTMAX-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中,您可以发送完整的longunsigned 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_intsi_value.sival_int 引用完全相同的 int,并且si_ptrsi_value.sival_ptr 引用完全相同的ptr。为了向后兼容,这些字段有一些额外的“名称”,仅此而已。

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

关于c - 使用 sigaction 发送有效负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40206629/

相关文章:

c - POSIX 取消点应该如何表现?

java - Java 中的 native 方法是否特定于操作系统?

c - C fork() 和 wait() 调用如何工作?

c - tasklet_action()函数中为什么会调用BUG?

c 和格式化输出

java - 用JDK1.7编译,在JRE 1.8中运行 : possible to install security patches?

linux - 用awk解析/proc/pid/smaps

c - 为什么我在 C/MEX 中出现内存泄漏?

c - C代码中switch-case中的 "..."是什么

c++ - 从给定路径的子目录中计算 txt 文件并包含给定的字符串