C fflush()无法正确刷新
我正在用C语言创建一个非常简单的程序执行计时器。我将在下面提供示例代码。问题是当使用Ctrl+C(即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 &
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;
}