繁体   English   中英

Linux:为什么sig_atomic_t typedef'ed为int?

[英]Linux: Why is sig_atomic_t typedef'ed to int?

在我的Linux机器上, sig_atomic_t是一个普通的旧int ints拥有一种特殊的原子质量?

$ gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
...
Thread model: posix
gcc version 4.3.2 (Debian 4.3.2-1.1) 

$ echo '#include <signal.h>' | gcc -E - | grep atomic
typedef int __sig_atomic_t;
typedef __sig_atomic_t sig_atomic_t;

C99 sig_atomic_t仅符合“原子性”的非常弱的定义,因为C99没有并发概念 ,只有可中断性。 (C2011增加了并发模型,并用它来_Atomic类型,使强大的保证,但是,据我所知sig_atomic_t是不变的,因为其存在的理由仍然是与信号处理,不能跨线程通信。)

这是C99所说的关于sig_atomic_t一切:

(§7.14 <signal.h> ,第2段)定义的类型是sig_atomic_t ,它是可以作为原子实体访问的对象的(可能是volatile限定的)整数类型,即使存在异步中断也是如此。 (§7.14 <signal.h> ,第2段)

(§7.14p5)如果[a]信号不是作为调用abortraise函数的结果发生的,那么如果信号处理程序引用具有静态存储持续时间的任何对象,而不是通过为声明的对象赋值,则行为是不确定的。作为volatile sig_atomic_t

(§7.18.3其他整数类型的限制,第3段)如果sig_atomic_t (见7.14)被定义为有符号整数类型,则SIG_ATOMIC_MIN的值不应大于-127, SIG_ATOMIC_MAX的值不应小于127 ; 否则,sig_atomic_t定义为无符号整数类型, SIG_ATOMIC_MIN的值应为0, SIG_ATOMIC_MAX的值应不小于255。

术语“原子实体”未在标准中的任何地方定义。 从标准转换, 目的是CPU可以使用一条机器指令完全更新内存中sig_atomic_t类型的变量(“静态存储持续时间”)。 因此,在无并发,精确可中断的C99抽象机中,信号处理程序不可能在更新中途观察sig_atomic_t类型的变量。 如果需要,§7.18.3p3语言许可此类型与char一样小。 请注意, 完全没有任何与跨处理器一致性相关的语言。

有些实际的CPU需要多条指令才能将大于char的值写入内存。 还有一些真正的CPU需要多条指令才能将小于机器字的值(通常但不一定与int相同)写入内存。 GNU C Library手册中的语言现在不准确。 它代表了原作者希望消除他们认为不必要的C实现许可证的做法,这样做会让应用程序员的生活更加艰难。 不幸的是,非常许可证使得在某些真机上拥有C成为可能。 至少有一个嵌入式Linux端口(对AVR),在一条指令中既不能将int也不能指针写入内存。 (人们正在努力使手册更准确,例如http://sourceware.org/ml/libc-alpha/2012-02/msg00651.html - sig_atomic_t似乎已经错过了那个。)

某些类型可能需要多条指令才能读/写。 int类型始终以原子方式读/写。

数据类型:sig_atomic_t

这是一个整数数据类型。 始终以原子方式访问此类对象。

实际上,您可以假设int和其他不超过int的整数类型都是原子的。 您还可以假设指针类型是原子的; 这很方便。 这两个都适用于GNU C库支持的所有机器,以及我们所知道的所有POSIX系统。

参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM