3

我想编写一个 SIGSEGV 处理程序,将消息写入文件(FILE *)。我听说 fprintf 不是可重入的,不应该在信号处理程序中调用。是否有它的可重入版本,或提供可在信号处理程序内调用的格式化文件 I/O 的任何其他函数?

4

1 回答 1

2

否。根据 C11 标准 N1570 版本的§7.14.1.1 ¶5:

abort如果 [the] 信号发生 [...],则如果 [...] 信号处理程序调用标准库中的函数、_Exit函数、quick_exit函数或函数 [...]之外的任何函数,则行为未定义signal

简而言之,您可以调用的唯一标准库函数是:

  • abort
  • _Exit
  • quick_exit
  • signal(附加限制适用)

显然,这些都不是格式化的 I/O 函数,所以如果你想坚持标准 C,你无能为力。


POSIX

那是标准 C 的观点。但是,如果您可以依赖 POSIX,则可以使用它的任何异步安全函数。异步安全函数之一是write,如您所料,它写入文件。它需要一个普通的缓冲区,所以如果你想格式化任何东西,你必须自己格式化,你也可能无法动态分配内存。您还必须小心访问全局变量和静态变量:C 标准规定您只能在类型为volatile sig_atomic_t.

只要您在 POSIX 平台上,跳过这些障碍将允许您在信号处理程序中编写消息。它不像fprintf,但如果你必须这样做,那就是它的完成方式。

于 2013-06-16T22:30:00.053 回答