我的问题是:
- 如果您无权访问某个函数的实现,是否有办法最终确定该函数是否是异步信号安全的?
- 如果不是,有没有办法测试函数是否足够异步信号安全以从信号处理程序调用?
如果您阅读 signal() 或 sigaction() 的手册页,您会得到一个异步信号安全函数列表(可以在信号处理程序中安全调用的函数)。但是,我相信这份 list 并不详尽。比如下面的页面http://linux.die.net/man/7/signal ,在 Async-signal-safe functions 标题下,读取:
POSIX.1-2004 (also known as POSIX.1-2001 Technical Corrigendum 2) requires an implementation to guarantee that the following functions can be safely called inside a signal handler:
然后它继续列出上面手册页中列出的正常异步信号安全函数。正如我所读,它说的是“它需要”,而不是“这些是唯一的”。
例如,this site说 back_trace_symbols_fd() 是异步信号安全的。该函数获取的是来自 dladdr() 的数据,它不像 back_trace_symbols() 那样使用 malloc(),因此看起来它可能是安全的。另外,我做了一些测试,dladdr() 的输出结构包含 char* 变量,但这些变量在运行时未分配。它们指向的 char 字符串甚至在调用 dladdr() 之前就存在于运行时。
任何能为我指明正确方向的想法或想法都将受到赞赏。
最佳答案
如果您无法访问函数的实现,可以查看手册页。如果手册页没有说它是异步安全的,并且 POSIX 标准也没有说它是异步安全的,那么唯一安全的结论是“它不是异步安全的”(再加上“不要使用它” ).
没有 100% 可靠的方法来测试一个函数是否是异步安全的。请记住,测试只能显示错误的存在,而不是它们的不存在(Dijkstra)。仅仅是你没有设法让函数在测试中出现异常行为这一事实可能仅仅意味着你的测试是不够的(但请放心,你不能冒犯的重要客户会立即和意外地设计出一个毁灭性的有效方法测试表明该函数几乎在您发布具有错误假设的代码后就不是异步安全的)。
关于objective-c - 确定一个函数是否是异步信号安全的(可以在信号处理程序中调用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9014560/