栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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]信号不是通过调用

abort
or或
raise
函数的结果发生的,则如果信号处理程序引用具有静态存储持续时间的任何对象,而不是通过为声明为的对象分配值,则该行为未定义
volatilesig_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
似乎已经在一个被错过,虽然)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/399124.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号