信号处理程序异步安全功能

时间:2015-12-25 18:20:58

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

有没有办法可以在信号处理程序中调用非异步安全函数?或者这不可能吗?

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

2 个答案:

答案 0 :(得分:4)

  

有没有办法可以在信号处理程序中调用异步安全函数?或者这不可能吗?

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

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

来自signal(7) Linux man page

  

异步信号安全功能

     

自处理以来,信号处理函数必须非常小心          其他地方可能会在执行中的某个任意点中断          该计划。 POSIX具有“安全功能”的概念。如果一个          信号中断执行不安全的函数和处理程序          调用一个不安全的函数,然后程序的行为是          未定义。

     

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

     

...

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

答案 1 :(得分:3)

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

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

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

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