确定函数是否是异步信号安全的(可以在信号处理程序中调用)

我的问题是:

  1. 如果您无法访问其实现,是否有办法确定函数是否是异步信号安全的?
  2. 如果没有,有没有办法测试函数是否异步信号安全足以从信号处理程序调用?

如果您读取signal()或sigaction()的手册页,您将获得一个async-signal-safe函数列表(可以在信号处理程序中安全地调用的函数)。 但是,我认为这份清单并非详尽无遗。 例如, Async-signal-safe函数头下的以下页面http://linux.die.net/man/7/signal读取:

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

然后它继续列出上面手册页中列出的正常异步信号安全function。 当我读它时,它说“它需要”,而不是“这些是唯一的”。

例如, 该站点说back_trace_symbols_fd()是异步信号安全的。 该函数获取的是来自dladdr()的数据,并且它不像back_trace_symbols()那样使用malloc(),所以看起来它可能是安全的。 此外,我做了一些测试,并且dladdr()的输出结构包含char *变量,但这些变量在运行时不是malloc。 他们指向的char字符串甚至在调用dladdr()之前就存在于运行时。

任何可以指向正确方向的想法或想法都会受到赞赏。

如果您无权访问该function的实现,可以查看手册页。 如果手册页没有说它是异步安全的,并且POSIX标准没有说它是异步安全的,唯一安全的结论是“它不是异步安全的”(加上“不要使用它”) )。

没有100%可靠的方法来测试函数是否是异步安全的。 请记住,测试只能显示错误的存在,而不是缺席(Dijkstra)。 事实上,你没有设法将这个function发挥到测试中的行为不端,这可能仅仅意味着你的测试不充分(但请放心,你不能冒犯的重要客户会立即意外地设计出极具破坏性的效果测试,certificate该函数几乎在您使用错误的假设释放代码时就不是异步安全的)。

您希望在信号处理程序中实现什么目标? 你应该考虑它是否适合它。 最好遵循手册页的建议:

 In general, signal handlers should do little more than set a flag; most other actions are not safe.