LINUX / glibc的。 我可以在信号处理程序中使用fprintf吗?

我可以在glibc / linux的信号(SIGALRM)处理程序中使用fprintf(stderr)吗?

你不能。 检查手册页信号(7)以获取异步信号安全功能列表。 fprintf不包含在该列表中。

如果你不需要格式化,那么你可以使用write(STDERR_FILENO, <buf>, <buflen>)写入stderr。

这是不安全的,引用了IBM DeveloperWorks有关Signal Handling Safety文章

假设信号处理程序使用fprintf打印一条消息,并且在信号传递时使用相同的流进行fprintf调用。 信号处理程序的消息和程序的数据都可能被破坏,因为这两个调用操作在相同的数据结构上:流本身。