在信号处理程序中访问长整数
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>
#define
s ATOMIC_LONG_LOCK_FREE
,您可以使用 <stdatomic.h>
中的 atomic_long
保证明确定义的行为volatile sig_atomic_t
的位置。这是例如GCC 4.9+ 在 AMD64 上的情况。
我知道在信号处理程序中访问静态变量是未定义的行为,除非该变量被声明为 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>
#define
s ATOMIC_LONG_LOCK_FREE
,您可以使用 <stdatomic.h>
中的 atomic_long
保证明确定义的行为volatile sig_atomic_t
的位置。这是例如GCC 4.9+ 在 AMD64 上的情况。