【问题标题】:Checking file handler before calling fclose在调用 fclose 之前检查文件处理程序
【发布时间】: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 是无情的。

标签: c file


【解决方案1】:

无法检查FILE* 是否已关闭。最安全的方法是检查fHandler是否为NULL,然后在调用fclose后直接将fHandler设置为NULL。

if(fhandler)
{
    fclose(fHandler);
    fHandler = NULL;
}

【讨论】:

  • 这当然需要先将变量初始化为NULL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 2014-12-09
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多