10

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

如果分叉的孩子也可以访问该文件,那么当他们完成该文件时应该怎么做?

4

4 回答 4

15

fclose()是与文件流相关的功能。当您在 的帮助下打开文件fopen()并将流分配给FILE *ptr. 然后您将使用fclose()关闭打开的文件。

close()是一个与文件描述符相关的函数。当您在 的帮助下打开文件open()并将描述符分配给int fd. 然后您将使用close()关闭打开的文件。

fopen()等函数fclose()C 标准函数,而其他类别的open()close()是 POSIX 特定的。这意味着用open(), close()etc 编写的代码不是标准的 C 代码,因此不可移植。而用fopen(), fcloseetc 编写的代码是标准代码,可以移植到任何类型的系统上。

我应该使用哪一个?

这取决于您打开文件的方式。如果你用 . 打开文件fopen(),你应该使用fclose(),如果你用 . 打开文件open(),你应该使用close().

如果分叉的孩子也可以访问该文件,那么当他们完成该文件时应该怎么做?

这也取决于您fork()拨打电话的位置:打开文件之前或打开文件之后。

请参阅:fork()ing 时是否共享文件描述符?

见:man fcloseman close

于 2013-10-24T11:39:23.877 回答
1

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

于 2013-10-24T11:38:49.230 回答
0

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

于 2013-10-24T11:43:08.420 回答
0

我应该使用哪一个?

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

于 2013-10-24T11:49:24.810 回答