信号处理程序内的格式化I / O.

时间:2013-06-16 22:03:57

标签: c io signals reentrancy

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

1 个答案:

答案 0 :(得分:2)

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

  

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

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

  • abort
  • _Exit
  • quick_exit
  • signal(适用其他限制)

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


POSIX

这是标准C的视图。但是,如果你可以依赖POSIX,那么你可以使用它的任何 async-safe 函数。其中一个异步安全函数是write,正如您所料,它会写入文件。它需要一个普通的缓冲区,所以如果你想格式化任何东西,你必须自己格式化,你也可能无法动态分配内存。您还必须小心访问全局变量和静态变量:C标准表示只有类型为volatile sig_atomic_t时才能访问它们。

只要你在POSIX平台上,跳过这些箍就可以让你在信号处理程序中写一条消息。它并不像fprintf那么容易,但如果你必须这样做,那就是它的完成方式。