问题描述
所以我在 c 中有两个应用程序。第一个必须使用实时信号向另一个发送数据。我要发送的数据是浮点值。据我所知,使用 rt 信号发送数据的唯一方法是使用 union sigval
。但是,它的 sival_int
字段是 int 类型,另一个字段是一个指针,我认为这在其他获取信号的进程中意义不大。我从我的老师那里知道以某种方式是可能的,但不知道如何解决这个问题。有什么想法吗?
编辑:澄清一下,我的老师说可以使用实时信号和 union sigval
来实现这一点,我很好奇如何实现。
解决方法
在当前所有的 Linux 硬件架构中,sizeof (int) == sizeof (float)
都没有任何填充位;它们的存储表示是相同的,将 float 类型转换为 int 然后再返回到 float 总是会产生原始的 float(和存储表示)。
这意味着您需要通过 memcpy(&value.sival_int,&float,sizeof (int))
将浮点数的存储表示复制到 int,或者使用联合来键入 float 和一个 int(这是 GCC 支持的扩展,clang 、icc 和其他可在 Linux 中使用的 C 编译器);然后通过sigqueue()
将信号和值发送到目标进程。
要接收信号和值,您可以使用 sigaction()
安装信号处理程序(使用 .sa_sigaction
作为函数指针,并在 SA_SIGINFO
中包含 .sa_flags
);或阻止信号(通过 sigprocmask()
)并使用 sigwaitinfo()
或 sigtimedwait()
明确捕获它。