fclose和close之间的区别
如果我fopen
一个文件,调用fclose
或close
之间有什么区别?我应该使用哪一个?
如果分叉的孩子也可以访问该文件,他们完成文件后应该怎么做?
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()
调用的位置:打开文件之前或打开文件之后。
请参阅: fork()时是否共享文件描述符?
见: man fclose
和man close
open()
和close()
是UNIX系统调用,它返回并获取文件描述符,以便与其他UNIX系统调用(如write()
。 fopen()
和fclose()
是标准的C库函数,它们在FILE*
s上运行,用于fwrite
和fprintf
类的东西。 后者几乎总是你应该使用的:它们更简单,更跨平台。
至于你的第二个问题,分叉的孩子与父母有相同的数字文件描述符,但它是一个副本; 他们可以关闭它,它仍将对父母和其他孩子开放。 (虽然我个人而言,我不喜欢在fork()
时打开文件…我喜欢明确地使用那种共享资源用法。管道当然是个例外。)
我应该使用哪一个?
如果用fopen
打开文件,请用fclose
关闭它。 在这种情况下使用close
可能会导致fopen
分配的句柄出现内存泄漏