信号处理程序异步安全函数

Signal handler async safe functions

本文关键字:函数 安全 异步 程序 信号处理      更新时间:2023-10-16

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

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

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

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

任何函数调用被标记为"异步信号安全"的原因都是为了将其标记为可以在信号处理程序中进行安全调用。

来自signal(7) Linux手册页:

异步信号安全功能

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

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

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

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

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

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

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