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

Met*_*est 5 c c++ linux signals

如何long在信号处理程序中设置类型变量(在 64 位机器上 = 8 字节)?我读过,您只能使用 类型的变量sig_atomic_t,它实际上是在volatile int信号处理程序内部实现的,并且修改大于int.

use*_*016 4

可以在信号处理程序内部使用 a 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;
}
Run Code Online (Sandbox Code Playgroud)

如果您想使用共享变量而不是sig_atomic_t使用原子 ( atomic_long_read, atomic_long_set)。