c - sig_atomic_t 实际上是如何工作的?

标签 c linux signals

编译器或操作系统如何区分 sig_atomic_t 类型和普通的 int 类型变量,并确保操作是原子的?使用两者的程序具有相同的汇编代码。如何特别注意使操作原子化?

最佳答案

sig_atomic_t 不是原子数据类型。它只是允许您在信号处理程序的上下文中使用的数据类型,仅此而已。因此,最好将该名称理解为“与信号处理相关的原子”。

为了保证与信号处理程序的通信,只需要原子数据类型的一个属性,即读取和更新将始终看到一致的值这一事实。其他数据类型(例如可能是 long long)可以用低位和高位部分的多条汇编指令来编写,例如sig_atomic_t 保证一次性读取和写入。

因此,平台可以选择任何整数基类型作为 sig_atomic_t,为此它可以保证 volatile sig_atomic_t 可以安全地用于信号处理程序。许多平台为此选择了 int,因为他们知道 int 是用一条指令编写的。

最新的 C 标准 C11 具有原子类型,但它们是完全不同的东西。其中一些(那些“无锁”的)也可以用在信号处理程序中,但这又是一个完全不同的故事。

关于c - sig_atomic_t 实际上是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24931456/

相关文章:

c# - 在 C# 中使用非托管代码 (C)

c - Ncurses 菜单 - 记住选择

linux bash脚本获取用户输入并存储在数组中

bash - 在 Bash 中,如何运行多个无限运行的命令并使用 ^C 将它们全部取消?

python - Django:断开 post_save 信号以避免递归

linux - 在同一项目中使用 .sa_sigaction 和 .sa_handler(手册页说明)

c - Z_MEM_ERROR Zlib deflateInit2() 嵌入式设备

linux - 对文件的前 5 个字符使用重命名命令

Linux - 只保存最近的 10 个文件夹并删除其余的

c++ - 如何将 C/C++ printf() 消息重定向到 Windows Phone 日志系统