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

C++ 在信号处理程序中使用长数据。,c++,c,linux,signals,C++,C,Linux,Signals,如何在信号处理程序中设置long(在64位机器上=8字节)类型的变量?我已经读到,您只能使用类型为sig\u atomic\u t的变量,它实际上在信号处理程序中实现为volatile int,修改大于int的数据类型是不安全的。您可以在信号处理程序中使用long,事实上,您可以使用任何东西。唯一需要注意的是正确的同步,以避免竞争条件 sig_atomic_t应用于信号处理程序和代码其余部分之间共享的变量。信号处理程序的任何“私有”变量可以是任何类型、任何大小 示例代码: #include &l

如何在信号处理程序中设置
long
(在64位机器上=8字节)类型的变量?我已经读到,您只能使用类型为
sig\u atomic\u 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;
}
#包括
静态易失性长共享;//不正常:共享不信号原子
静态易失性信号原子良好共享;//好的:共享信号原子
无效处理程序(int-signum)
{
int localent=17;
long localLong=23;//确定:未共享
if(badShared==0)//不正常:共享的不是信号原子
++不良共享;
if(goodShared==0)//OK:shared-sig\u-atomic\t
++良好共享;
}
int main()
{
信号(SOMESIGNAL,handler);
badShared++;//不正常:共享不信号原子
goodShared++;//确定:共享信号原子
返回0;
}

如果您想使用除
sig\u atomic\u t
之外的共享变量,请使用原子(
atomic\u long\u read
atomic\u long\u set
)。

您不能使用锁与信号处理程序同步-这只会死锁,因为信号处理程序不像线程那样并行运行。