在信号处理程序中访问长整数

时间:2015-03-29 19:29:24

标签: c signals

我理解在信号处理程序中访问静态变量是未定义的行为,除非变量声明为volatile sig_atomic_t。但是,我正在为64位机器编写程序,其中sig_atomic_t恰好是32位。我可以使用long等效的sig_atomic_t吗?

我知道sig_atomic_t只是int的typedef,所以也许volatile long会这样做;我只是不习惯做任何特别未定义的行为。

谢谢!

2 个答案:

答案 0 :(得分:1)

答案似乎是" no",标准不涵盖long类似物。 Linux: Why is sig_atomic_t typedef'ed to int?的答案涉及很多细节,引用的标准明确省略了任何可能大于整数的类型。

Using long data inside signal handler.所述,信号处理程序当然可以访问任何类型的数据,但不能依赖于共享其他类型的数据。

答案 1 :(得分:0)

新的C11标准指定了一个可选的并发模型和几种类型,可以安全地用于信号处理程序。

关于信号处理程序,它现在说(强调我的):

  

如果信号处理程序引用静态或线程存储持续时间不是 无锁原子对象 的任何对象,而不是通过赋值,则行为未定义声明为 volatile sig_atomic_t

的对象

无锁类型是底层架构直接支持对原子操作进行操作的类型(不需要使用锁)。

因此,<stdatomic.h>#define ATOMIC_LONG_LOCK_FREE s atomic_long,您可以使用<stdatomic.h>中的volatile sig_atomic_t来代替singularities。这是例如在AMD64上使用GCC 4.9+的情况。

相关问题