【问题标题】:Signal handler async safe functions信号处理程序异步安全函数
【发布时间】:2015-12-25 18:20:57
【问题描述】:

有没有一种方法可以从信号处理程序中调用非异步安全函数?或者这是不可能的?

我不是要在信号处理程序中设置一个标志,然后在我的“主代码”中打印一些东西,但在这种情况下,信号处理程序将自行定义我的程序的逻辑流程。

【问题讨论】:

  • "有没有办法可以从信号处理程序中调用非异步安全函数?" 不,至少不是以安全的方式。

标签: c++ c function c++11 signals


【解决方案1】:

从技术上讲,您可以在信号处理程序中调用或编写任何函数,没有什么可以阻止您这样做。

不鼓励的原因是,当信号处理程序处理您的操作时,可能会引发另一个信号,这可能会使信号处理程序跳转到更高优先级的信号处理程序。

由于我们不知道信号处理的顺序,这种情况会导致竞争和难以调试的问题。

这就是为什么信号处理程序应该很轻以避免难以调试竞争条件的原因,通常我们设置标志以指示信号已被引发并在读取这些标志的主线程或另一个线程中处理它。

【讨论】:

  • 还是有点困惑,如果信号处理程序调用了安全函数,仍然可能会引发另一个信号,这可能会使信号处理程序跳转到更高优先级的信号处理程序。那么使用之间有什么区别安全或不安全的功能?
【解决方案2】:

有没有一种方法可以从信号处理程序中调用 non 异步安全函数?或者这是不可能的?

没有。不安全。这样做会导致未定义的行为 - 很可能是死锁,但也可能发生其他事情。

任何函数调用都被标记为“异步信号安全”的原因是为了将其标记为从信号处理程序中调用是安全的。

来自signal(7) Linux man page

异步信号安全函数

信号处理函数必须非常小心,因为处理 其他地方可能会在执行中的某个任意点被中断 的程序。 POSIX 有“安全功能”的概念。如果一个 信号中断不安全函数的执行,并且处理程序 调用一个不安全的函数,那么程序的行为是 未定义。

POSIX.1-2004(也称为 POSIX.1-2001 技术勘误表 2) 需要一个实现来保证以下功能 可以在信号处理程序中安全地调用:

...

如果未列出函数调用,则从信号处理程序中调用它是不安全的。

【讨论】:

  • 对不起,我的意思是非异步安全函数!
猜你喜欢
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
相关资源
最近更新 更多