gpt4 book ai didi

c - fflush() 没有正确冲洗

转载 作者:太空宇宙 更新时间:2023-11-04 07:21:49 27 4
gpt4 key购买 nike

我正在用 C 语言创建一个非常简单的程序执行计时器。我将在下面提供示例代码。问题是 fflush(NULL) 在以 < kbd>Ctrl+C(即 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

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;
}

最佳答案

您的程序调用了未定义的行为。您不能在信号处理程序中调用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com