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
)。您不能使用锁与信号处理程序同步-这只会死锁,因为信号处理程序不像线程那样并行运行。