是否有必要在程序中打开多次文件?
Is it necessary to close a file number of time it is opened in program?
如果文件是使用 fopen() 打开的,并且处于不同的模式,那么是否需要多次关闭它,或者它可以在代码结束时关闭一次?
每次打开文件时,您都会收到不同的文件描述符或文件句柄。因此,如果通过 fopen()
打开,则必须使用 fclose()
关闭每个文件句柄;如果通过 open()
.
打开,则必须使用 close()
关闭每个文件句柄
你必须关闭所有这些。
当您使用 open
系列系统调用时,它们 return 您 file-descriptor
(fopen
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
函数是创建流的 fopen
和 freopen
函数的基础原语。
int open (const char *filename, int flags[, mode_t mode])
它为 filename
命名的文件创建并 returns 一个新文件 描述符。参数 mode
仅在创建文件时使用,但在任何情况下提供参数都无妨。
因此,每当 open
或 fopen
调用新文件 descriptor 时,这些 descriptors 会保留分配到程序结束。
函数close
或fclose
关闭文件描述符字段。关闭文件具有以下后果:
- 文件 描述符 已取消分配。
- 进程拥有的文件上的任何记录锁都已解锁。
- 当与管道或 FIFO 关联的所有文件 描述符 都已关闭时,所有未读数据都将被丢弃。
如果您 open
或 fopen
而没有 close
,那么该描述符将不会被清理,并且会一直存在到程序关闭。
如果 open
有很多调用或任何文件可能被打开多次(每次都没有关闭),问题将很严重,然后描述符将 泄漏,直到 OS 拒绝或无法创建另一个描述符,在这种情况下,对 fopen
的调用失败并且程序可能崩溃。
在大多数 POSIX 操作系统上,包括 Linux 和 Os X,每个进程都分配了固定的 table 文件句柄或文件描述符。这通常约为 1024 个句柄。当您尝试打开第 1025 个文件描述符时,操作系统会终止您的进程。
问题几乎可以肯定是您泄漏了文件句柄。也就是说,句柄正在打开,完成后它们不会关闭。
为避免描述符泄漏,您必须在每次重新打开文件之前close
或fclose
。
看看 GNU 对 Opening and Closing Files 的描述。
如果文件是使用 fopen() 打开的,并且处于不同的模式,那么是否需要多次关闭它,或者它可以在代码结束时关闭一次?
每次打开文件时,您都会收到不同的文件描述符或文件句柄。因此,如果通过 fopen()
打开,则必须使用 fclose()
关闭每个文件句柄;如果通过 open()
.
close()
关闭每个文件句柄
你必须关闭所有这些。
当您使用 open
系列系统调用时,它们 return 您 file-descriptor
(fopen
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
函数是创建流的 fopen
和 freopen
函数的基础原语。
int open (const char *filename, int flags[, mode_t mode])
它为 filename
命名的文件创建并 returns 一个新文件 描述符。参数 mode
仅在创建文件时使用,但在任何情况下提供参数都无妨。
因此,每当 open
或 fopen
调用新文件 descriptor 时,这些 descriptors 会保留分配到程序结束。
函数close
或fclose
关闭文件描述符字段。关闭文件具有以下后果:
- 文件 描述符 已取消分配。
- 进程拥有的文件上的任何记录锁都已解锁。
- 当与管道或 FIFO 关联的所有文件 描述符 都已关闭时,所有未读数据都将被丢弃。
如果您 open
或 fopen
而没有 close
,那么该描述符将不会被清理,并且会一直存在到程序关闭。
如果 open
有很多调用或任何文件可能被打开多次(每次都没有关闭),问题将很严重,然后描述符将 泄漏,直到 OS 拒绝或无法创建另一个描述符,在这种情况下,对 fopen
的调用失败并且程序可能崩溃。
在大多数 POSIX 操作系统上,包括 Linux 和 Os X,每个进程都分配了固定的 table 文件句柄或文件描述符。这通常约为 1024 个句柄。当您尝试打开第 1025 个文件描述符时,操作系统会终止您的进程。
问题几乎可以肯定是您泄漏了文件句柄。也就是说,句柄正在打开,完成后它们不会关闭。
为避免描述符泄漏,您必须在每次重新打开文件之前close
或fclose
。
看看 GNU 对 Opening and Closing Files 的描述。