首页 > 解决方案 > 为什么我的将 __sig_atomic_t 定义为 int 而不是 volatile int

问题描述

我正在阅读“计算机系统:程序员的视角”,在第 8 章中,它说 sig_atomic 可以用作可以在信号处理程序中使用的标志的类型。但是当我跟踪我的头文件时,它被定义为没有volatile的int,是不是意味着当main修改标志时,它可能使用'write back'而不是'write through',这可能是不正确的?

标签: csignals

解决方案


因为sig_atomic_t在实践中应该总是被限定volatile(至少对于在信号处理程序中设置的变量)。它(正式)与 C11原子类型无关(即使名称可能令人困惑)。但sig_atomic_t实际上应该是某种可以在单个机器代码指令中写入或从内存中读取的整数类型(并且您需要对其进行限定volatile以使其根据需要发生,并指示编译器不要将其缓存在某个寄存器等中...)。

对于 Linux,另请参见signal(7)和最重要的 signal-safety(7)

请注意,C11 标准并没有提供很多关于信号的信息(通过阅读n1570进行检查,尤其是 §7.14)。实际上,您可能需要为它们提供一些操作系统支持。另请参见 POSIX信号概念

另请阅读操作系统:三个简单的部分


推荐阅读