是否可以通过实时信号发送浮点值?
Is it possible to send out float value with realtime signal?
所以我在 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))
将 float 的存储表示复制到 int,或者使用联合来对 float 和 int 进行类型双关(这是 GCC 支持的扩展、clang、icc 和其他可在 Linux 中使用的 C 编译器);然后通过 sigqueue()
.
将信号和值发送到目标进程
要接收信号和值,您可以使用 sigaction()
安装信号处理程序(使用 .sa_sigaction
作为函数指针,并在 .sa_flags
中包含 SA_SIGINFO
);或阻止信号(通过 sigprocmask()
)并使用 sigwaitinfo()
或 sigtimedwait()
.
明确捕获它
所以我在 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))
将 float 的存储表示复制到 int,或者使用联合来对 float 和 int 进行类型双关(这是 GCC 支持的扩展、clang、icc 和其他可在 Linux 中使用的 C 编译器);然后通过 sigqueue()
.
要接收信号和值,您可以使用 sigaction()
安装信号处理程序(使用 .sa_sigaction
作为函数指针,并在 .sa_flags
中包含 SA_SIGINFO
);或阻止信号(通过 sigprocmask()
)并使用 sigwaitinfo()
或 sigtimedwait()
.