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

Accessing long integers in signal handlers

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

我知道 sig_atomic_t 只是 int 的类型定义,所以也许 volatile long 可以;我只是不愿意做任何特别未定义的行为。

谢谢!

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

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

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

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

the behavior is undefined if the signal handler refers to any object with static or thread storage duration that is not a lock-free atomic object other than by assigning a value to an object declared as volatile sig_atomic_t

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

因此,#if __STDC_NO_ATOMICS__!=1<stdatomic.h> #defines ATOMIC_LONG_LOCK_FREE,您可以使用 <stdatomic.h> 中的 atomic_long 保证明确定义的行为volatile sig_atomic_t 的位置。这是例如GCC 4.9+ 在 AMD64 上的情况。