2015-12-25 31 views
1

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

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

+0

“*有没有一种方法可以在信号处理程序中调用非异步安全函数?*”不,至少不是以安全的方式。 – alk

回答

2

从技术上讲,你可以在信号处理程序内调用或写入任何函数,但没有任何东西阻止你这样做。

为什么它的泄气的原因是,当信号处理程序处理您的操作,有可能是提出了另一个信号,这可能使信号处理程序跳转到更高的优先级信号处理程序。

这种导线的种族和难以调试的问题,因为我们不知道的信号处理顺序的。

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

4

有没有办法可以拨打从信号处理程序中获取异步安全功能?或者这是不可能的?

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

的原因,任何函数调用标记为“异步信号安全”是其标记为安全地从信号处理程序中调用的真正目的。

signal(7) Linux man page

异步信号安全功能

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

POSIX.1-2004(又称POSIX.1-2001技术勘误2) 要求的实现,以保证以下功能 可以安全地调用一个讯号处理器中:

...

如果函数调用没有列出,这不是安全地从信号处理程序中调用它。

+0

对不起,我的意思是非异步安全功能! – Curious

+0

@Curious - 修正。 –