【发布时间】:2021-11-25 15:56:12
【问题描述】:
我如何检查在调用 fclose( fHandler ) 时,在此之前是否存在 fHandler = fopen(foo, "w");?在一个程序中有一个部分会打开一个索引号增加的文件:
char buffer[1024];
sprintf(buffer, "./trace%d.txt", id);
fHandler = fopen(buffer, "w");
在代码的其他地方,我尝试关闭此类文件。
fclose(fHandler);
我想在fclose() 之前检查类似if (fHandle_is_still_open) 的内容。似乎用NULL 检查fHandler 可以解决我不想要的文件的存在。我该如何解决?
更新:
原因是,在执行的某个地方,我得到了这个错误:
free(): invalid pointer
和 gdb 报告:
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1 0x00007ffff5e34859 in __GI_abort () at abort.c:79
#2 0x00007ffff5e9f3ee in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7ffff5fc9285 "%s\n")
at ../sysdeps/posix/libc_fatal.c:155
#3 0x00007ffff5ea747c in malloc_printerr (str=str@entry=0x7ffff5fc74ae "free(): invalid pointer")
at malloc.c:5347
#4 0x00007ffff5ea8cac in _int_free (av=<optimized out>, p=<optimized out>, have_lock=0) at malloc.c:4173
#5 0x00007ffff5e94043 in _IO_deallocate_file (fp=0x555556ade8a0) at libioP.h:863
#6 _IO_new_fclose (fp=0x555556ade8a0) at iofclose.c:74
#7 是 fclose 调用。
【问题讨论】:
-
你的程序应该记住它对文件句柄/文件描述符做了什么。
-
理想情况下,
fHandler应该在关闭时设置为 NULL,如果以后有可能需要检查它。这不可能吗? -
@wildplasser:我想防止特定文件出现双重
fclose()。 -
您的程序应该记住它第一次关闭。这可以通过将程序状态存储在变量中(例如,将 fp 设置为 NULL)和/或避免第二次调用 fclose() 的代码路径来完成。
-
如果您无法跟踪您打开和关闭了哪些文件,C 不是您应该使用的语言。 C 是无情的。