在信号处理程序中使用长数据

Using long data inside signal handler.

本文关键字:数据 信号处理 程序      更新时间:2023-10-16

如何在信号处理程序中设置类型为long的变量(在64位机器上= 8字节)?我读到你只能使用类型sig_atomic_t的变量,这实际上是在信号处理程序中实现的volatile int,修改大于int的数据类型是不安全的。

可以在信号处理程序中使用long,实际上您可以使用任何东西。您唯一需要注意的是适当的同步,以避免竞争条件。

sig_atomic_t应该用于信号处理程序和其他代码之间共享的变量。信号处理程序的任何"私有"变量都可以是任意类型,任意大小。

示例代码:
#include <signal.h>
static volatile long badShared; // NOT OK: shared not sig_atomic_t
static volatile sig_atomic_t goodShared; // OK: shared sig_atomic_t
void handler(int signum)
{
    int  localInt  = 17;
    long localLong = 23; // OK: not shared
    if (badShared == 0) // NOT OK: shared not sig_atomic_t
        ++badShared;
    if (goodShared == 0) // OK: shared sig_atomic_t
        ++goodShared;
}
int main()
{
    signal(SOMESIGNAL, handler);
    badShared++; // NOT OK: shared not sig_atomic_t
    goodShared++; // OK: shared sig_atomic_t
    return 0;
}
如果您想使用sig_atomic_t以外的共享变量,请使用atomics (atomic_long_read, atomic_long_set)