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

b5buobof  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(110)

问题代码优先(最小化情况):

#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不会发生
为什么会这样呢?处理程序代码在什么环境/上下文中运行?我在哪里可以读到这个?

bqf10yzr

bqf10yzr1#

简而言之:您不能在信号处理程序中安全地使用printf
在signal handler的手册页中有一个list of authorized functions。其中没有fprintf
这是因为这个函数不是可重入的,主要是因为它可以使用mallocfree。请参阅this post了解详细说明。

kqlmhetl

kqlmhetl2#

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

8xiog9wr

8xiog9wr3#

除了可重入性问题之外,由于counter不是易失性的,它的读取可能会被抛出while(1)循环,导致循环中的printf总是打印0,即使信号处理程序递增全局变量。

相关问题