【发布时间】:2015-09-15 01:03:33
【问题描述】:
如果文件是使用 fopen() 以不同的模式打开的,那么是否需要关闭它的次数,或者它可以在代码结束时关闭一次?
【问题讨论】:
标签: c file-handling
如果文件是使用 fopen() 以不同的模式打开的,那么是否需要关闭它的次数,或者它可以在代码结束时关闭一次?
【问题讨论】:
标签: c file-handling
open 函数是 fopen 和 freopen 函数的底层原语,用于创建流。
int open (const char *filename, int flags[, mode_t mode])
它为filename 命名的文件创建并返回一个新文件descriptor。 mode 参数仅在创建文件时使用,但在任何情况下提供参数都没有坏处。
所以每当open 或fopen 调用一个新文件descriptor 时,这些descriptor 会一直分配到程序结束。
函数close 或fclose 关闭文件描述符字段。关闭文件会产生以下后果:
如果您open 或fopen 而不是close,则该描述符将不会被清除,并且会一直持续到程序关闭为止。
如果有大量的open 调用,或者任何文件可能被多次打开(而不是每次都关闭),那么问题将很严重,那么描述符将被泄露,直到操作系统拒绝或无法创建另一个描述符,在这种情况下,对fopen 的调用失败并且程序可能会崩溃。
在大多数 POSIX 操作系统上,包括 Linux 和 Os X,每个进程都分配有一个固定的文件句柄或文件描述符表。这通常是大约 1024 个句柄。当您尝试打开第 1025 个文件描述符时,操作系统会终止您的进程。
问题几乎可以肯定是您正在泄漏文件句柄。也就是说,句柄正在打开,并且在您使用完它们之后它们不会关闭。
为避免描述符泄漏,您必须在每次重新打开文件之前close 或fclose。
看看 GNU 对Opening and Closing Files 的描述。
【讨论】:
每次打开文件时,都会收到不同的文件描述符或文件句柄。因此,如果通过fopen() 打开,则必须使用fclose() 关闭每个文件句柄;如果通过open() 打开,则必须使用close()。
【讨论】:
close() 如果通过 open() 打开。
您必须关闭所有这些。
当您使用open-family 系统调用时,它们会返回一个file-descriptor
(fopen 返回 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()。
【讨论】: