fclose和close之间的区别

时间:2013-10-24 11:35:04

标签: c file posix file-descriptor

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

如果分叉儿童也可以访问该文件,他们在完成文件后应该怎么做?

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

至于你的第二个问题,分叉的孩子与父母有相同的数字文件描述符,但它是一个副本;他们可以关闭它,它仍将对父母和其他孩子开放。 (虽然我个人而言,我不喜欢在fork()时打开文件...我喜欢明确地使用这种共享资源用法。管道当然是个例外。)

答案 3 :(得分:0)

  

我应该使用哪一个?

如果您使用fopen打开文件,请使用fclose将其关闭。在这种情况下使用close可能会导致由fopen

分配的句柄发生内存泄漏