是否可以通过实时信号发送浮点值?

问题描述

所以我在 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() 明确捕获它。