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

标签 c signals

我正在阅读“计算机系统:程序员的视角”,在第 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 .

另请阅读Operating Systems: Three Easy Pieces

关于c - 为什么我的 <signal.h> 将 __sig_atomic_t 定义为 int 而不是 volatile int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50037809/

相关文章:

可以使用 fseek() 将数据插入文件中间吗? - C

c - 创建线程,然后所有线程在临界区之前退出

c - linux信号掩码函数中sig_atomic_t的用法

c - 为什么这段代码会打印垃圾值?

c - MPI_Bcast 动态二维数组

c - Ruby 源文件中的 "VALUE"类型是什么?

c - 在 c 中使用 fork() 和信号处理进行编程

c++ - 如何向自己发出信号(相同的 PID)?

c - 为什么 printf 在 macOS 上会破坏信号处理程序,但在 ubuntu 上却不会?

c - 为什么这个无效的输入仍然有效? (切换大小写)字符错误