如果我使用fopen
打开了一个文件,那么调用fclose
或close
有什么区别,应该使用哪一个?
如果fork的子进程也可以访问该文件,那么当他们完成对文件的操作后应该怎么做?
如果我使用fopen
打开了一个文件,那么调用fclose
或close
有什么区别,应该使用哪一个?
如果fork的子进程也可以访问该文件,那么当他们完成对文件的操作后应该怎么做?
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 fclose
和man close
fdopen()
创建了文件流,则也可以使用fclose()
关闭文件描述符。文件描述符不会被复制,当由fdopen()创建的流关闭时,它将被关闭。
来源:https://linux.die.net/man/3/fdopen - TimFinneganopen()
和close()
是UNIX系统调用,返回并获取文件描述符,可与其他UNIX系统调用(如write()
)一起使用。fopen()
和fclose()
是标准C库函数,操作FILE*
,可与fwrite
和fprintf
等内容一起使用。后者几乎总是您应该使用的:它们更简单,更跨平台。
fork()
时保持文件打开...我喜欢明确共享资源使用。当然,管道是一个例外。)我应该使用哪一个?
如果您使用 fopen
打开文件,则应使用 fclose
关闭它。在此情况下使用 close
可能会导致由 fopen
分配的句柄内存泄漏。