C fflush()无法正确刷新

C fflush()无法正确刷新,c,signals,fflush,C,Signals,Fflush,我正在用C语言创建一个非常简单的程序执行计时器。我将在下面提供示例代码。问题是当使用Ctrl+C(即SIGINT信号)结束程序时,fflush(NULL)不会从stdout刷新每个“Hello World\n”。它们有时在估计运行时间之后仍然出现…消息,我想知道为什么 定时器 #include <signal.h> #include <time.h> #include <errno.h> #include <stdlib.h> #include &

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

定时器

#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);
}
timerTest.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;
}
#包括
#包括“timer.h”
内部主(空)
{
if(installTimer())
{
printf(“错误:installTimer()失败。\n”);
返回1;
}
int i;
对于(i=0;i<300000;+i)
printf(“你好,世界!\n”);
返回0;
}

您的程序调用未定义的行为。不能在信号处理程序内部调用
fflush()
。在信号处理程序中调用IO库函数通常是个坏主意

严格一致的程序只能从信号处理程序中调用C标准库函数
abort()
\u Exit()
quick\u Exit()
、和
signal()

换句话说,
fflush()
不是异步安全的,所以请不要尝试这样做

有关更多详细信息,请参见此问题:


这个问题指向一个可能的解决方法链接。

您的程序调用未定义的行为。不能在信号处理程序内部调用
fflush()
。在信号处理程序中调用IO库函数通常是个坏主意

严格一致的程序只能从信号处理程序中调用C标准库函数
abort()
\u Exit()
quick\u Exit()
、和
signal()

换句话说,
fflush()
不是异步安全的,所以请不要尝试这样做

有关更多详细信息,请参见此问题:


这个问题指向一个可能的解决方法链接。

您的程序调用未定义的行为。不能在信号处理程序内部调用
fflush()
。在信号处理程序中调用IO库函数通常是个坏主意

严格一致的程序只能从信号处理程序中调用C标准库函数
abort()
\u Exit()
quick\u Exit()
、和
signal()

换句话说,
fflush()
不是异步安全的,所以请不要尝试这样做

有关更多详细信息,请参见此问题:


这个问题指向一个可能的解决方法链接。

您的程序调用未定义的行为。不能在信号处理程序内部调用
fflush()
。在信号处理程序中调用IO库函数通常是个坏主意

严格一致的程序只能从信号处理程序中调用C标准库函数
abort()
\u Exit()
quick\u Exit()
、和
signal()

换句话说,
fflush()
不是异步安全的,所以请不要尝试这样做

有关更多详细信息,请参见此问题:


这个问题指向一个可能的解决方法链接。

谢谢,但是你也有Windows异步信号安全功能的列表吗?如果我理解正确,也无法在程序结束时打印估计时间消息,因为
fflush()
不是异步信号安全的(尽管我可以用
write
替换
printf
,如果这在Windows上是安全的).哼哼,我在这里要说实话:对于Windows,我不知道。你可以安装一个Windows POSIX实现,然后使用POSIX列表实现异步安全功能。否则,我建议阅读具体的文档。我通常不为Windows开发,所以我真的不在这个世界上。至于你的第二个问题,是的,你会有使用安全调用(如
write
)执行此操作。谢谢,但是您也有针对Windows的异步信号安全函数列表吗?另外,如果我理解正确,则无法在程序结束时打印估计时间消息,因为
fflush()
不是异步信号安全的(尽管我可以用
write
替换
printf
,如果这在Windows上是安全的).哼哼,我在这里要说实话:对于Windows,我不知道。你可以安装一个Windows POSIX实现,然后使用POSIX列表实现异步安全功能。否则,我建议阅读具体的文档。我通常不为Windows开发,所以我真的不在这个世界上。至于你的第二个问题,是的,你会有使用安全调用(如
write
)执行此操作。谢谢,但是您也有针对Windows的异步信号安全函数列表吗?另外,如果我理解正确,则无法在程序结束时打印估计时间消息,因为
fflush()
不是异步信号安全的(尽管我可以用
write
替换
printf
,如果这在Windows上是安全的).哼哼,我在这里要说实话:对于Windows,我不知道。你可以安装一个Windows POSIX实现,然后使用POSIX列表实现异步安全功能。否则,我建议阅读具体的文档。我通常不为Windows开发,所以我真的不在这个世界上。至于你的第二个问题,是的,你会有使用安全调用(如
write
)执行此操作。谢谢,但是您也有针对Windows的异步信号安全函数列表吗?另外,如果我理解正确,则无法在程序结束时打印估计时间消息,因为
fflush()
不是异步信号安全的(虽然我可以用
write
替换
printf
,如果这在Windows上是安全的)。嗯,老实说,对于Windows,我不知道。你可以安装一个Windows POSIX实现,然后使用POSIX列表实现异步安全功能。否则,我建议阅读特定的文档。我通常不会开发
#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;
}