问题代码优先(最小化情况):
#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。然后在另一个贝壳里。
kill -s SIGINFO <pid_of_my_process>
发送信号,c
递增。但fprintf
不会发生
为什么会这样呢?处理程序代码在什么环境/上下文中运行?我在哪里可以读到这个?
3条答案
按热度按时间bqf10yzr1#
简而言之:您不能在信号处理程序中安全地使用
printf
。在signal handler的手册页中有一个list of authorized functions。其中没有
fprintf
。这是因为这个函数不是可重入的,主要是因为它可以使用
malloc
和free
。请参阅this post了解详细说明。kqlmhetl2#
您可能需要fflush stderr来获取要在程序退出之前写入的消息。
8xiog9wr3#
除了可重入性问题之外,由于
counter
不是易失性的,它的读取可能会被抛出while(1)
循环,导致循环中的printf总是打印0,即使信号处理程序递增全局变量。