我正在阅读“计算机系统:程序员的视角”,在第 8 章中,它说 sig_atomic 可以用作可在信号处理程序中使用的标志的类型。但是当我跟踪我的头文件时,它被定义为 int 而没有 volatile,是不是意味着 main 修改标志时可能会使用“write back”而不是“write through”,这可能是不正确的?
最佳答案
因为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 .
关于c - 为什么我的 <signal.h> 将 __sig_atomic_t 定义为 int 而不是 volatile int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50037809/