gpt4 book ai didi

c - fprintf 后文件指针设置为 NULL

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:58:20 24 4
gpt4 key购买 nike

我有以下代码:

void mylog(const char *fmt, ...) 
{
static FILE *logfp = NULL;
struct timeval tv;
struct timezone tz;
struct tm *tm;
va_list argptr;
char fname[256];
extern char *__progname;

if(logfp == NULL) {
snprintf(fname, 256, "%s.log", __progname);
logfp = fopen(fname, "a");
if(logfp == NULL) {
fprintf(stderr, "Unable to create log file.\n");
return;
}
}

va_start(argptr, fmt);
gettimeofday(&tv, &tz);
tm = localtime(&tv.tv_sec);
fprintf(logfp, "%04d-%02d-%02d:%02d.%02d.%02d.%lu:",
tm->tm_year+1900, tm->tm_mon, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec, tv.tv_usec);
vfprintf(logfp, fmt, argptr);
va_end(argptr);
fflush(logfp);

if(ftell(logfp) > 256*1024) {
fclose(logfp);
logfp = NULL;

/* Below - Logic to rename this log file for log rotation */
}
}

我观察到 vfprintf 调用发生崩溃。 gdb 堆栈跟踪是:

#0  _IO_vfprintf_internal (s=0x0, format=0x4a8960 "log message\n", ap=0x7fa4b4202d30) at vfprintf.c:1269

上面这段代码之前运行没有任何问题。但是,这次崩溃对我来说很奇怪。我无法找到 fprintf 如何将 logfp 设置为 NULL。 fmt 设置为“日志消息\n”。

最佳答案

既然是多线程程序,建议把代码包裹在mutex中:

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

...

pthread_mutex_lock(&mutex);

/* very important code... */

pthread_mutex_unlock(&mutex);

...

关于c - fprintf 后文件指针设置为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24922735/

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