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

标签 objective-c c posix signals

我的问题是:

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

如果您阅读 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/

相关文章:

objective-c - NSPopover 失去第一响应者

ios - FUIEmailAuth 未声明

ios - 正则表达式捕获 { 字符之前的所有文本 - Objective C

ios - 在两个依赖框架中链接静态库时重新定义模块

c - 为什么我会在这个 C 程序中得到这个运行时错误?请告诉我哪里出了问题

c - 为 C 代码生成调用图

c - 如何更改 tcsetattr() 的 Linux 中断定时器

linux - 检查用 O_NONBLOCK 打开的文件描述符是否已准备好

c - 如果不处理 printf 会发生什么

c - __typeof__ 宏扩展为函数名