fclose和close

fclose和close

fclose函数的原型和所在库:

       #include 

       int fclose(FILE *fp);

 返回值:成功返回0,否则返回EOF并设置errno指明错误原因。

fclose()函数会清空fp指向的流缓冲区并关闭该文件描述符。

注意:fclose()会刷新用户和内核缓冲空间。


close函数的原型和所在库:

       #include 

       int close(int fd);

返回值:成功返回0,出错返回-1并设置errno为适当的值。

close()函数关闭一个文件描述符,并移除相关的记录锁。

如果fd是某一打开文件最后一个文件描述符,那么会释放该资源;如果fd是最后一个指某文件的描述符并且该文件已经使用unlink()删除,那么这个文件会被永久删除。

注意:不检查close()是个很常见但又非常严重的错误。很有可能在最后一个close()时,报告一个之前write()的错误。当关闭文件时不检查close()的返回值,可以导致数据静默丢失。特别是在NFS和磁盘配额时。

当close()成功返回后,也不能保证数据不丢失,因为内核会延迟写操作。因为当流被关闭时会刷新缓存,所以并不常见于这种情况。使用fsync()来确定数据已经物理写入。

当文件正在使用时,有可能被同一进程的不同线程关闭。因为文件描述符可能会被重用,由于一些鲜为人知的竞争条件,它会导致一些意想不到的副作用。

在socket编程中,必须确定没有recv()在其它线程中仍然是阻塞状态,因为不会有信息通过socket发送过来了。所以在关闭socket之前要使用shutdown()关闭所有连接。

Comments are closed.