为什么我的<signal.h>将__sig_atomic_t定义为int而不是volatile int

时间:2018-04-26 08:02:01

标签: c signals

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

1 个答案:

答案 0 :(得分:3)

因为sig_atomic_t实际上应始终使用volatile限定(至少对于信号处理程序中设置的变量)。它(正式)与C11 atomic types无关(即使名称可能令人困惑)。但是sig_atomic_t实际上应该是一种可以在单个machine code指令中写入或读取内存的整数类型(并且您需要将其限定为volatile以使其按需要发生,并指示编译器不将其缓存在某些寄存器等中......)。

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

请注意,C11标准并没有说明signals(通过阅读n1570进行检查,特别是§7.14)。实际上,您可能需要一些operating system支持。另见POSIX signal concepts

另请阅读Operating Systems: Three Easy Pieces