当前位置: 首页 > 面试题库 >

Linux:为什么将sig_atomic_t类型定义为int?

劳星晖
2023-03-14
问题内容

在我的Linux机器上,sig_atomic_t是一个普通的旧机器int。DO 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来保证更强的类型;但是,AFAIK sig_atomic_t保持不变,因为其
存在的理由 仍然是与信号处理程序通信,而不是跨线程。)

这就是C99所说的sig_atomic_t

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

(第7.14p5节)如果[a]信号不是通过调用abortor或raise函数的结果发生的,则如果信号处理程序引用具有静态存储持续时间的任何对象,而不是通过为声明为的对象分配值,则该行为未定义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库手册中的语言现在不正确。原始作者希望消除他们认为C实现不必要的许可证,以进行怪异的事情,这使应用程序程序员的生活更加艰难。不幸的是,正是这种许可才使得在某些真实机器上完全拥有C成为可能。至少有一个嵌入式Linux端口(至AVR),而这两个端口均没有int指针也不能在一条指令中写入内存。(人们正在努力使本手册更准确,例如见http://sourceware.org/ml/libc-
alpha/2012-02/msg00651.html - sig_atomic_t似乎已经在一个被错过,虽然)。



 类似资料:
  • 哎呀,这是一个标准的“成语” 问:为什么INT_MIN的定义不是as-2147483648?

  • 问题内容: 为什么Java不允许将顶级类声明为私有?除了“我们无法访问私人课程”之外,还有其他原因吗? 问题答案: 顶级类作为私有类是完全没有用的,因为没有人可以访问它。

  • 问题内容: 我想声明一个type 。 为什么以下原因给我一个错误: 但是以下工作原理: ? 问题答案: 只能引用类型,不能引用基元。是一类,而不是原始的。 声明时,您将创建一个将存储类型而不是原始类型的。 如果您想了解基本类型和引用类型之间的区别,请查看http://pages.cs.wisc.edu/~hasti/cs302/examples/primitiveVsRef.html

  • 问题内容: 引用http://sites.google.com/site/gson/gson-design- document : 为什么Gson中的大多数课程都标记为期末考试? 尽管Gson通过提供可插入的串行器和反序列化器提供了相当可扩展的体系结构,但Gson类并不是专门设计为可扩展的。提供非最终类将允许用户合法地扩展Gson类,然后期望该行为在所有后续修订版中均有效。我们选择通过将类标记为f

  • 我有一个类型 现在我想做这样的事情。 如何将我的 转换为基元类型? 它给我的错误是: 将“Rating”类型转换为“number”类型可能是错误的,因为这两种类型都没有充分重叠。如果这是有意的,首先将表达式转换为“未知” 我已经经历过了,但我想要的是它的反面 编辑: tsconfig.json tsc版本:3.2.1