信号执行期间的 sigprocmask

2024-03-26

我目前正在研究使用sigprocmask阻止某些信号(在这种情况下,SIGALRM and SIGCHLD)当关键代码段正在执行时。与这些信号关联的两个信号处理程序都将访问和修改中央数据结构,因此在主进程处理该数据结构时阻止它们访问它至关重要。

目前,我的计划是简单地在代码关键部分的开头禁用这些信号,然后在最后重新启用它们。

void criticalFunction(void) {
    // disable signals with sigprocmask
    // critical code
    // enable signals with sigprocmask
}

但是,将被阻止的信号的信号处理程序也会调用criticalFunction。当他们打电话时会发生什么sigprocmask功能并启用对自己信号的阻塞?他们会停止执行还是继续执行? (或者第三个条件..)

我能找到的关于此的唯一注释如下:

如果在信号处理程序中调用 sigprocmask(),则从 处理程序可以通过恢复原始状态来撤消 sigprocmask() 的工作 待处理信号掩码。 (http://www.mkssoftware.com/docs/man3/sigprocmask.3.asp http://www.mkssoftware.com/docs/man3/sigprocmask.3.asp)

(这是我之前问题的后续问题:信号处理程序访问队列数据结构(竞争条件?) https://stackoverflow.com/questions/8146108/signal-handler-accessing-queue-data-structure-race-condition)


请记住,信号处理程序内的默认行为是阻止正在处理的信号。此外,当在信号处理程序内部进行函数调用时,您只想调用信号安全函数。照这样说,sigprocmask() is a 信号安全功能 https://www.securecoding.cert.org/confluence/display/seccode/SIG30-C.+Call+only+asynchronous-safe+functions+within+signal+handlers,如果您使用它来阻止被内部调用的信号处理程序阻止的相同信号,那么实际上什么都不会发生......您将保留当前相同的信号掩码有。唯一的区别是,在信号处理程序内部,只有任一信号SIGALRM or SIGCHLD保证被阻止(这取决于您所在的信号处理程序),当您调用时sigprocmask()要阻止这些特定信号,呼叫后这两个信号都将被阻止。

需要注意的是代码的第二部分criticalFunction当你尝试打电话时sigprocmask() to enable当前在信号掩码中被阻止的信号。这可能会造成这样一种情况:您最终会在对信号处理程序的调用中出现一定程度的重入。换句话说,为您所在的信号处理程序启用信号可能意味着在您退出当前信号处理程序之前,另一个SIGALRM or SIGCHLD被捕获,您将再次重新进入信号处理程序来处理这个新捕获的信号。只要您在任何关键部分更新后启用信号,那么我认为您应该可以适应这种可重入的情况,但为了安全起见,您可能只想在criticalFunction在最后criticalFunction,而不是中间的某个地方,当你从criticalFunction,不要做任何不异步安全的事情......你必须假设第二个返回后的任何代码sigprocmask()可能没有按顺序执行(即,它可能在捕获第二个信号并且运行其信号处理程序后执行)。

如果您尝试从exec家庭,或者信号处理程序中类似的东西。会发生的情况是,新覆盖的进程将从当前进程继承信号掩码,因此如果当前进程阻止了某些信号,那么它们也会在新进程中被阻止。因此,如果新进程假设信号已畅通,则新进程中的信号处理程序将永远不会运行。

顺便说一句,一个警告:不要混合信号和线程!您在问题中提到“主进程”......我希望这并不意味着您试图混合信号和线程。如果是这样,那就需要一个非常具体的习惯用法,否则你会造成各种破坏。

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

信号执行期间的 sigprocmask 的相关文章

  • 为什么我的 C#/pinvoke DeviceIoControl 调用返回 0 字节读取的垃圾数据?

    我有一个运行良好的非托管 C Windows 控制台应用程序 我想要它在 C 中 我已经为必要的 Kernel32 dll 符号完成了 DllImport 语句 StructLayout LayoutKind Sequential inte
  • 在哪里使用 EF6 订阅 ObjectMaterialized?

    我正在尝试将我的上下文订阅到以下 OnjectMaterialized 事件this https stackoverflow com a 3756842 2835713 像这样 IObjectContextAdapter this Obje
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • 无法在表适配器配置属性中找到对象“Web.config”的连接“MyConnName”

    I want to change the query in table adapter but it s not opening throwing an error Configure table Adapter Failed in pro
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • std::async 参数的生命周期是多少?

    看来函数的参数是通过std async分享未来的生活 include
  • 通过 EUSART PIC18F45K80 打印消息

    我正在尝试向 Docklight 发送串行消息 但始终收到空值 我正在使用带有 XC8 MPLAB X 的 PIC18F45K80 我的代码中的所有内容似乎都是正确的 但我想我错了 我该如何修复它 include
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • 为什么 .Net 框架指南建议您不要使用 ref/out 参数?

    显然 他们很 混乱 这是认真的原因吗 你还能想到其他的吗 你见过有多少开发人员并不真正理解 ref out 吗 我在真正需要的地方使用它们 但在其他地方则不然 它们通常仅在您想有效返回两个或多个值时才有用 在这种情况下它至少值得thinki
  • 为什么我在这段代码中不断得到两个相同的随机值? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我的随机数生成器在 C 中不是随机的 https stackoverflow com questions 932520 why does it appear that my random num
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • C++ 中类型信息何时向后流动?

    我刚刚看了 Stephan T Lavavej 的演讲CppCon 2018关于 类模板参数推导 在哪里某个点 https youtu be H ut6j1BYU t 941他顺便说 在 C 中 类型信息几乎永远不会向后流动 我不得不说 几
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • C 中函数“fgets”的参数太少

    每当我编译这个错误时 我都会收到该错误 但我不知道为什么 我直接从书上抄袭这个 有人可以帮忙吗 include
  • C++ 项目编译为静态库,编译为动态库失败(链接器错误)。为什么?

    我有一个 VS2008 本机 C 项目 我希望将其编译为 DLL 它仅引用一个外部库 log4cplus lib 并使用其功能 当然也使用 log4cplus 的 h 文件 当我尝试将我的项目编译为静态库时 它成功了 当我尝试作为 DLL
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • 如何在您的网站中连接两个人

    有一款名为 Verbosity 的游戏 这是一款有目的的游戏 位于此链接上www gwap com 在游戏中 他们随机连接两个玩家互相玩 游戏是玩家1应该向他的搭档 玩家2 描述一个单词 而玩家2应该猜测这个单词 我正在尝试建立一个网站来执

随机推荐