【问题标题】:Is it necessary to close a file number of time it is opened in program?是否需要关闭一个文件在程序中打开的次数?
【发布时间】:2015-09-15 01:03:33
【问题描述】:

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

【问题讨论】:

    标签: c file-handling


    【解决方案1】:

    open 函数是 fopenfreopen 函数的底层原语,用于创建流。

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

    它为filename 命名的文件创建并返回一个新文件descriptormode 参数仅在创建文件时使用,但在任何情况下提供参数都没有坏处。

    所以每当openfopen 调用一个新文件descriptor 时,这些descriptor 会一直分配到程序结束。

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

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

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

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

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

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

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

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

    【讨论】:

    • 你在这里说描述符泄漏。这到底是什么意思?
    【解决方案2】:

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

    【讨论】:

    • ... 或 close() 如果通过 open() 打开。
    【解决方案3】:

    您必须关闭所有这些。

    当您使用open-family 系统调用时,它们会返回一个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()

    【讨论】:

    • 它解释得很好。但是我应该怎么做才能避免这种事情呢?
    • 我不认为只保存两个文件描述符而不是一个,然后关闭它们是不是太糟糕了。这真的取决于你想要做什么。
    猜你喜欢
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多