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

时间:2012-03-03 17:01:12

标签: c signals

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

#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不会发生。

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

2 个答案:

答案 0 :(得分:15)

简而言之:您无法在信号处理程序

中使用安全 printf

信号处理程序手册页中有一个list of authorized functions,位于 Async-signal-safe 部分。其中没有fprintf。

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

答案 1 :(得分:1)

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