我的问题是:
- 如果您无权访问函数的实现,是否有办法最终确定函数是否是异步信号安全的?
- 如果没有,有没有办法测试函数是否足够异步信号安全,可以从信号处理程序调用?
如果您阅读 signal() 或 sigaction() 的手册页,您将获得异步信号安全函数(可以在信号处理程序内部安全调用的函数)的列表。然而,我相信这个清单并不详尽。例如下面的页面http://linux.die.net/man/7/signal http://linux.die.net/man/7/signal, 在下面异步信号安全函数标题内容如下:
POSIX.1-2004(也称为 POSIX.1-2001 技术勘误表 2)需要一种实现来保证可以在信号处理程序内安全地调用以下函数:
然后继续列出上面手册页中列出的正常异步信号安全函数。当我读到它时,它说“它需要”,而不是“这些是唯一的”。
例如,这个网站 http://www.unix.com/man-page/All/3c/backtrace_symbols_fd/表示 back_trace_symbols_fd() 是异步信号安全的。该函数获取的是来自 dladdr() 的数据,并且它不像 back_trace_symbols() 那样使用 malloc(),因此看起来可能是安全的。另外,我做了一些测试,dladdr() 的输出结构包含 char* 变量,但这些变量在运行时不会进行 malloc。它们指向的字符字符串甚至在调用 dladdr() 之前就存在于运行时。
任何可以为我指明正确方向的想法或想法都将受到赞赏。
如果您无权访问该函数的实现,可以查看手册页。如果手册页没有说它是异步安全的,并且 POSIX 标准也没有说它是异步安全的,那么唯一安全的结论是“它不是异步安全的”(加上“不要使用它” )。
没有 100% 可靠的方法来测试函数是否异步安全。请记住,测试只能显示错误的存在,而不能显示错误的不存在(Dijkstra)。仅仅因为您没有设法让该功能在测试中表现不佳,就可能仅仅意味着您的测试不够充分(但请放心,您不能冒犯的重要客户将立即意外地设计出一种毁灭性的有效方法)测试表明,几乎只要您发布带有错误假设的代码,该函数就不是异步安全的)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)