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