我正在用C语言创建一个非常简单的程序执行计时器。下面将提供示例代码。问题是当用Ctrl+C(即fflush(NULL)信号)结束一个程序时,"Hello World\n"不会刷新stdout中的每个SIGINT。它们有时仍然出现在Estimated running time...消息之后,我想知道为什么。
定时器c

#include <signal.h>
#include <time.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>

#define _TIMER
#include "timer.h"

static clock_t startTime;

int installTimer(void)
{
    errno = 0;
    if (signal(SIGINT, signalHandler) == SIG_ERR ||
        signal(SIGTERM, signalHandler) == SIG_ERR ||
        signal(SIGABRT, signalHandler) == SIG_ERR)
        return 1;
    if (atexit(displayTimer))
        return 1;
    if ((startTime = clock()) == -1)
        return 1;
    return 0;
}

static void displayTimer()
{
    clock_t endTime;
    if ((endTime = clock()) == -1)
        printf("ERROR: clock() failed.\n");
    else
        printf("Estimated running time: %.4fs\n", (endTime - startTime) / (double) CLOCKS_PER_SEC);
}

static void signalHandler(int signal)
{
    fflush(NULL);
    exit(EXIT_FAILURE);
}

定时器.h:
int installTimer(void);

#ifdef _TIMER
   static void displayTimer(void);
   static void signalHandler(int);
#endif

时间测试c
#include <stdio.h>
#include "timer.h"

int main(void)
{
    if (installTimer())
    {
        printf("ERROR: installTimer() failed.\n");
        return 1;
    }
    int i;
    for (i = 0; i < 300000; ++i)
        printf("Hello World!\n");
    return 0;
}

最佳答案

程序调用未定义的行为。不能在信号处理程序内部调用fflush()。在信号处理程序中调用IO库函数通常是个坏主意。
严格一致的程序只能从信号处理程序中调用C标准库函数abort()_Exit()quick_exit()signal()
换句话说,fflush()不是异步安全的,所以请不要尝试这样做。
有关详细信息,请参见以下问题:I need a list of Async-Signal-Safe Functions from glibc
这个问题指向了与可能的解决办法的联系。

关于c - fflush()无法正确刷新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21063681/

10-11 21:03