Printf无法在C信号处理程序中工作

有问题的代码(最小化案例):

#include  #include  int counter = 0; void react_to_signal(int n) { fprintf(stderr, "Caught!\n"); counter++; } int main(int argc, char** argv) { signal(SIGINFO, react_to_signal); while (1) { printf("%d\n", counter); } return 0; } 

我运行代码,它应该循环,打印出来0.然后在另一个shell ..

 kill -s SIGINFO  

信号传递, c递增..但fprintf不会发生。

为什么会这样? 处理程序代码在什么环境/上下文中运行? 我在哪里可以读到这个?

简而言之:您无法在信号处理程序中安全地使用printf

Async-signal-safe部分的信号处理程序手册页中有一个授权函数列表 。 其中没有fprintf。

那是因为这个函数不是可重入的 ,主要是因为它可以使用malloc和free。 有关详细说明,请参阅此post 。

在程序退出之前,您可能需要fflush stderr以获取要写入的消息。