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以获取要写入的消息。