有问题的代码(最小化案例):
#include <stdio.h>
#include <signal.h>
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 <pid_of_my_process>
发送信号,c
递增..但fprintf
不会发生。
为什么会这样?处理程序代码在什么环境/上下文中运行?我在哪里可以读到这个?
答案 0 :(得分:15)
简而言之:您无法在信号处理程序
中使用安全 printf信号处理程序手册页中有一个list of authorized functions,位于 Async-signal-safe 部分。其中没有fprintf。
那是因为这个函数不是可重入,主要是因为它可以使用malloc和free。 有关详细说明,请参阅this post。
答案 1 :(得分:1)
在程序退出之前,您可能需要先刷新stderr以获取要写入的消息。