在golang中,移动打开的文件是否会导致泄漏或任何其他问题?

时间:2018-10-15 16:43:53

标签: go operating-system file-descriptor

考虑以下代码:

f, err := os.Create(tmpFilepath)
defer f.Close()
// do some writing to f
os.Rename(tmpFilepath, newpath)

为简化起见,已删除了一些错误处理。

此外,我知道这段代码是错误的,但是我试图理解这段代码对文件的正确性和性能的影响。

这里有资源泄漏吗?

顺便说一句,解决方法是在完成写入文件后关闭。

1 个答案:

答案 0 :(得分:3)

如果我们正在讨论实现POSIX语义的操作系统和文件系统(也就是说,不是Windows,通常不允许您重命名打开的文件),则绝对没有问题:打开的文件描述符仅算作硬链接文件的数据。

重命名文件的数据不会以某种方式与打开的文件描述符分离-将后者视为对该数据的一种“匿名”引用。

引用the close(2) manual

  

如果文件的链接计数为0,则当与该文件关联的所有文件描述符都关闭时,该文件所占用的空间将被释放,并且该文件将不再可访问。