gpt4 book ai didi

c - 信号处理程序中的格式化 I/O

转载 作者:行者123 更新时间:2023-12-04 09:40:34 24 4
gpt4 key购买 nike

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

最佳答案

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

If [the] signal occurs […], the behavior is undefined if […] the signal handler calls any function in the standard library other than the abort function, the _Exit function, the quick_exit function, or the signal function […].

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

  • 中止
  • _Exit
  • quick_exit
  • 信号(附加限制适用)

显然,这些都不是格式化 I/O 函数,因此如果您想坚持使用标准 C,您无能为力。


POSIX

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

只要您在 POSIX 平台上,跳过这些环节就可以让您在信号处理程序中写入消息。它不像 fprintf 那样简单,但如果您必须这样做,那就是这样做的方式。

关于c - 信号处理程序中的格式化 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17138158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com