fclose和close的区别

13

如果我使用fopen打开了一个文件,那么调用fcloseclose有什么区别,应该使用哪一个?

如果fork的子进程也可以访问该文件,那么当他们完成对文件的操作后应该怎么做?


2
还有一件事需要记住。C FILE* 流在内部使用缓冲 I/O。fclose() 会刷新此缓冲区,然后关闭操作系统级别的文件描述符。close() FILE* 流可能不会刷新此内部缓冲区,导致数据丢失。因此,在 C 流中始终使用 C fxxx() 函数。 - O.C.
4个回答

18

fclose() 是与文件流相关的函数。当你使用 fopen() 打开文件并将流分配给 FILE *ptr 时,你会使用 fclose() 来关闭已打开的文件。

close() 是与文件描述符相关的函数。当你使用open()打开文件并将描述符分配给int fd时,你会使用close()来关闭已打开的文件。

fopen()fclose()等函数是C标准函数,而另一类如open()close()等函数则是POSIX特定的。这意味着用open()close()等函数编写的代码不是标准的C代码,因此不可移植。而用fopen()fclose()等函数编写的代码是标准的,并且可以在任何类型的系统上移植。

我应该使用哪个?

这取决于你如何打开文件。如果你使用fopen()打开文件,则应该使用fclose();如果你使用open()打开文件,则应该使用close()

如果派生的子进程也可以访问该文件,当他们完成文件操作后应该怎么做?

这也取决于你在哪里进行了fork()调用:在打开文件之前还是之后。

参见:Are file descriptors shared when fork()ing?

参见:man fcloseman close


如果使用fdopen()创建了文件流,则也可以使用fclose()关闭文件描述符。文件描述符不会被复制,当由fdopen()创建的流关闭时,它将被关闭。来源:https://linux.die.net/man/3/fdopen - TimFinnegan

1

open()close()是UNIX系统调用,返回并获取文件描述符,可与其他UNIX系统调用(如write())一起使用。fopen()fclose()是标准C库函数,操作FILE*,可与fwritefprintf等内容一起使用。后者几乎总是您应该使用的:它们更简单,更跨平台。


0
关于您的第二个问题,分叉的子进程具有与父进程相同的数字文件描述符,但它是一个副本;他们可以关闭它,但对于父进程和其他子进程仍然是打开的。(尽管个人而言,我不喜欢在fork()时保持文件打开...我喜欢明确共享资源使用。当然,管道是一个例外。)

0

我应该使用哪一个?

如果您使用 fopen 打开文件,则应使用 fclose 关闭它。在此情况下使用 close 可能会导致由 fopen 分配的句柄内存泄漏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接