Linux:信号处理程序执行可以被抢占吗?

2023-12-31

我遇到了以下信号处理程序代码,它存储 errno 变量,以便它不会影响主线程的 errno 处理。

void myhandler(int signo)
{
    int esaved;
    esaved = errno;
    write(STDOUT_FILENO, "Got a signal\n", 13);
    errno = esaved;
}

但这真的能达到目的吗?如果另一个线程在 write() 之后和恢复 errno 之前检查共享 errno 变量,会发生什么?该线程会由于竞争条件而获得错误的 errno 值吗?

或者执行信号处理程序原子地相对于线程/进程,这样一旦信号处理程序执行,内核就不会调度线程,直到信号处理程序完成?

换句话说 - 一旦启动,信号处理程序是否会执行而不会被以下情况中断:

 - 1) Scheduler (process/threads),  or  
 - 2) Other signals,  or
 - 3) Hardware interrupt handlers  ?

信号处理程序确实可以被另一个信号中断(假设它与首先调用处理程序的信号不是同一信号)。

您的处理程序仍然可以通过传递另一种信号来中断。为了避免这种情况,您可以使用传递给 sigaction 的操作结构的 sa_mask 成员来显式指定在信号处理程序运行时应阻止哪些信号。这些信号是除了调用处理程序的信号以及通常被进程阻止的任何其他信号之外的信号。请参阅处理程序的阻塞。

当处理程序返回时,阻塞信号集将恢复到处理程序运行之前的值。因此,在处理程序内部使用 sigprocmask 只会影响处理程序本身执行期间可以到达的信号,而不影响处理程序返回后可以到达的信号。

http://www.gnu.org/software/libc/manual/html_node/Signals-in-Handler.html#Signals-in-Handler http://www.gnu.org/software/libc/manual/html_node/Signals-in-Handler.html#Signals-in-Handler

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux:信号处理程序执行可以被抢占吗? 的相关文章

随机推荐

  • c# Linq to Objects - FirstOrDefault 性能

    我们正在尝试优化一些方法 我们使用 Redgate 的性能分析器来查找一些性能漏洞 我们的工具通过多种方法使用 Linq to 对象 但我们注意到 一个FirstOrDefault收集 1000 个对象需要很长时间 探查器还警告查询速度非常
  • 在 SparkSQL 中使用 Avro 模式和 Parquet 格式进行读/写

    我正在尝试从 SparkSQL 写入和读取 Parquet 文件 出于模式演变的原因 我想在写入和读取中使用 Avro 模式 我的理解是 这可以在 Spark 之外 或在 Spark 中手动 使用例如AvroParquetWriter 和
  • 旋转端口登陆Android4.X后如何避免智能手机中的剪切/复制/粘贴?

    我正在努力避免在智能手机中剪切 复制 粘贴 对于平板电脑来说没问题 它在端口模式下很好 但在陆地模式下 EditText 显示一个 下一步 按钮 选择文本后 下一个按钮将转换为具有复制 剪切和粘贴选项的编辑按钮 那么 当编辑按钮出现时 有什
  • Java 中条件运算符内部的转换

    这会在 Eclipse IDE 中出现错误 错误符号出现在行号附近 String allText null 之后我做了一些事情 比如初始化数组等等 但要根据一些条件 所以我想使用如下所示的条件运算符 List
  • 是否可以仅在加载所有模块后才显示 shell?

    我目前正在开发一个应用程序 该应用程序使用 PRISM 4 将其功能划分为不同的模块 我注意到我的应用程序的 Shell 在其区域中保存了模块的视图 在加载模块之前加载并显示 这意味着首先显示 Shell 然后在相当长的时间 大约半秒 之后
  • 不带括号和带括号调用函数有什么区别

    在 onPressed 或 Ontap 上调用不带括号的函数和带括号的函数有什么区别 我只知道在 onPressed 上不能用括号调用 void 函数 floatingActionButton FloatingActionButton on
  • mutate 是否通过引用更改 tbl?

    我真正喜欢的是什么data table is the 通过引用更改表的习惯用法 无需昂贵的副本 据我了解 这是使data table与其他方法相比 速度超快 现在 我开始玩dplyr包似乎具有同样的性能 但由于结果仍然必须使用 lt 操作员
  • java 中的同步 - 正确使用

    我正在构建一个在多进程 线程 中使用的简单程序 我的问题更容易理解 什么时候我必须使用保留字同步 我是否需要在影响骨骼变量的任何方法中使用这个词 我知道我可以将它放在任何非静态的方法上 但我想了解更多 谢谢你 这是代码 public cla
  • 导轨和主干一起工作

    我刚刚开始研究 MVC 结构 首先我看看如何backbone js工作了 现在我刚刚完成僵尸的轨道 http railsforzombies org 由代码学校提供 我知道我还没有深入研究这些内容 但我首先有一个问题 您可以一起使用这些库吗
  • 错误:操作数 1 处向量寄存器的使用无效

    我正在 64 位 Aarch64 设备上的 ARM 下学习 GCC 内联汇编器 我看到一条我不太明白的错误消息 来自 GCC 内联汇编器的错误消息 gcc DNDEBUG g3 O1 march armv8 a crc crypto tes
  • codeigniter 允许 uri 中使用特殊字符(例如:ä、é、î、ø、ù)

    如何在 codeigniter 的 uri 中允许特殊字符 例如 您不能直接在 URL 中使用特殊字符 RFC 1738 包含以下段落 URL 只用图形来写 US ASCII 的可打印字符 编码字符集 US ASCII 字符集中的字符列表可
  • Rails 4 devise_invitable 邀请令牌无效

    我一直在关注Ryan Boland 的优秀 Rails 多租户教程 https www youtube com watch v nXqwFEjxyhM 但遇到了 devise invitable 的问题 我在用 Rails 4 1 5 de
  • 如何 IKVM Apache POI

    我想在我的 NET 应用程序中使用 Apache POI 我知道有一个端口 NPOI 但它不完整并且没有 PowerPoint 相关功能 我尝试使用以下命令对其进行 IKVM ikvmc target library poi 3 8 jar
  • biblatex:自定义参考书目条目

    我目前正在努力处理我的 BibLaTeX 文件 我想把这两个信息变成粗体 我正在使用下面的模板 但找不到插入的正确位置textbf or a 马克比博尔德属性 甚至不知道在这个用例中这是否是正确的属性 每次尝试都失败和 或使我的整个项目崩溃
  • Django 多对多限制

    我是数据库和 Django 的新手 我对触发器了解甚少 我创建了一个关于学术专家系统的数据库 这里所有论文最多应有 4 个主题 如果选择的主题多于 则应发出 主题过多 的警告 一个主题可以由许多论文拥有 所以这是一种多对四的关系 但我不知道
  • 如何从 C# 代码调用 Google 地理编码服务

    我有一个 C 类库 从那里我必须调用谷歌服务并获取纬度和经度 我知道如何在页面上使用 AJAX 来完成此操作 但我想直接从我的 C 类文件调用 Google 地理编码服务 有什么方法可以做到这一点 或者我可以使用任何其他服务来实现此目的 你
  • 用 Haskell 编写 Zipwith

    我正在尝试写ZipwithHaskell 中的函数 如果我使用以下值运行它 它应该返回以下结果 Prelude gt zipWith 10 20 30 33 44 94 43 64 124 到目前为止我的代码是 Zipwith f Zipw
  • Google 电子表格“无法调用 null 的方法“getRange””

    如果 B 列从第六行开始的每一行都发生了变化 我想在 A 列中生成一个唯一的 ID 使用 1 到 X 之间的数字作为 ID 就足够了 但在移动 de row 后它不应该改变 但我不断收到错误 无法调用 null 的方法 getRange f
  • 使用所有插件引导新的 Eclipse 机器

    在新机器上引导 Eclipse 是一个非常耗时的过程 您最终会问自己是否真的需要每个插件 但这一切都很方便 并且有助于养成一致的习惯 Eclipse 引导问题包括 解释 记录需要发生的事情 粘贴正确的 URL 并下载的实际时间 版本兼容性和
  • Linux:信号处理程序执行可以被抢占吗?

    我遇到了以下信号处理程序代码 它存储 errno 变量 以便它不会影响主线程的 errno 处理 void myhandler int signo int esaved esaved errno write STDOUT FILENO Go