是否有必要在程序中打开多次文件?

Is it necessary to close a file number of time it is opened in program?

如果文件是使用 fopen() 打开的,并且处于不同的模式,那么是否需要多次关闭它,或者它可以在代码结束时关闭一次?

每次打开文件时,您都会收到不同的文件描述符或文件句柄。因此,如果通过 fopen() 打开,则必须使用 fclose() 关闭每个文件句柄;如果通过 open().

打开,则必须使用 close() 关闭每个文件句柄

你必须关闭所有这些。

当您使用 open 系列系统调用时,它们 return 您 file-descriptorfopen returns FILE* 这基本上是一个包含文件描述符的结构。看看文件定义)。

typedef struct 
{
 short level ;
 short token ;
 short bsize ;
 char fd ; <-- here
 unsigned flags ;
 unsigned char hold ;
 unsigned char *buffer ;
 unsigned char * curp ;
 unsigned istemp; 
}FILE ;

因此 fopen() 您最终会 close()/fclose() 给您两个不同的文件*(显然还有不同的文件描述符)。

open 函数是创建流的 fopenfreopen 函数的基础原语。

int open (const char *filename, int flags[, mode_t mode])

它为 filename 命名的文件创建并 returns 一个新文件 描述符。参数 mode 仅在创建文件时使用,但在任何情况下提供参数都无妨。

因此,每当 openfopen 调用新文件 descriptor 时,这些 descriptors 会保留分配到程序结束。

函数closefclose关闭文件描述符字段。关闭文件具有以下后果:

  • 文件 描述符 已取消分配。
  • 进程拥有的文件上的任何记录锁都已解锁。
  • 当与管道或 FIFO 关联的所有文件 描述符 都已关闭时,所有未读数据都将被丢弃。

如果您 openfopen 而没有 close,那么该描述符将不会被清理,并且会一直存在到程序关闭。

如果 open 有很多调用或任何文件可能被打开多次(每次都没有关闭),问题将很严重,然后描述符将 泄漏,直到 OS 拒绝或无法创建另一个描述符,在这种情况下,对 fopen 的调用失败并且程序可能崩溃。

在大多数 POSIX 操作系统上,包括 Linux 和 Os X,每个进程都分配了固定的 table 文件句柄或文件描述符。这通常约为 1024 个句柄。当您尝试打开第 1025 个文件描述符时,操作系统会终止您的进程。

问题几乎可以肯定是您泄漏了文件句柄。也就是说,句柄正在打开,完成后它们不会关闭。

为避免描述符泄漏,您必须在每次重新打开文件之前closefclose

看看 GNU 对 Opening and Closing Files 的描述。