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