我想编写一个SIGSEGV处理程序,将消息写入文件(FILE *)。我听说fprintf不是可重入的,不应该在信号处理程序中调用。是否有可重入的版本,或者提供可以在信号处理程序中调用的格式化文件I / O的任何其他函数?
答案 0 :(得分:2)
没有。根据C11标准N1570版本的§7.14.1.1¶5:
如果[the]信号发生[...],如果信号处理程序调用标准库中除
abort
函数,_Exit
函数之外的任何函数,则行为未定义,quick_exit
函数或signal
函数[...]。
简而言之,您可以调用的唯一标准库函数是:
abort
_Exit
quick_exit
signal
(适用其他限制)显然,这些都不是格式化的I / O函数,所以如果你想坚持使用标准C,那么你无能为力。
这是标准C的视图。但是,如果你可以依赖POSIX,那么你可以使用它的任何 async-safe 函数。其中一个异步安全函数是write
,正如您所料,它会写入文件。它需要一个普通的缓冲区,所以如果你想格式化任何东西,你必须自己格式化,你也可能无法动态分配内存。您还必须小心访问全局变量和静态变量:C标准表示只有类型为volatile sig_atomic_t
时才能访问它们。
只要你在POSIX平台上,跳过这些箍就可以让你在信号处理程序中写一条消息。它并不像fprintf
那么容易,但如果你必须这样做,那就是它的完成方式。