是否需要关闭程序中打开的文件号?

时间:2015-06-28 14:27:46

标签: c file-handling

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

filename命名的文件创建并返回一个新文件 descriptor 。参数mode仅在创建文件时使用,但在任何情况下都不会提供参数。

因此,只要创建openfopen调用新文件描述符,并且这些描述符保持分配,直到程序结束。

函数closefclose关闭文件描述符字段。关闭文件会产生以下后果:

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

如果您openfopen而不是close,那么该描述符将不会被清除,并且会一直持续到程序关闭。

如果有大量open的调用或任何文件可能被多次打开(每次都没有关闭),那么问题就会很严重,那么描述符将被泄露 ,直到操作系统拒绝或无法创建另一个描述符,在这种情况下,对fopen的调用失败,程序可能崩溃。

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

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

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

看看GNU描述的Opening and Closing Files

答案 2 :(得分:1)

你必须关闭所有这些。

当您使用open - 系列系统调用时,他们会返回file-descriptorfopen返回FILE*,它基本上是一个包含文件描述符的结构。查看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()你会给你两个不同的FILE *(显然是不同的文件描述符),你最终应该close()/fclose()