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

时间:2011-07-30 11:11:41

标签: c++ c linux signals

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

1 个答案:

答案 0 :(得分:4)

可以在信号处理程序中使用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以外的共享变量,请使用原子(atomic_long_readatomic_long_set)。