【问题标题】:Formatted I/O inside signal handler信号处理程序内的格式化 I/O
【发布时间】:2013-06-16 22:03:57
【问题描述】:

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

【问题讨论】:

标签: c io signals reentrancy


【解决方案1】:

没有。根据 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那么简单,但如果你必须这样做,那就是这样做的。

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2011-11-18
    • 2019-07-31
    相关资源
    最近更新 更多