В golang перемещение открытого файла вызывает утечку или любую другую проблему? - PullRequest
0 голосов
/ 15 октября 2018

Рассмотрим следующий код:

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

Для упрощения удалена некоторая обработка ошибок.

Кроме того, я знаю, что этот код неверен, но я пытаюсь понять, чтоЭффект этого кода с точки зрения правильности файлов и с точки зрения производительности.

Есть ли утечка ресурсов здесь?

Кстати, исправление должно быть закрыто, когда вы закончитезапись в файл.

1 Ответ

0 голосов
/ 15 октября 2018

Если мы говорим с ОС и файловой системой, реализующими семантику POSIX (то есть не Windows, которая обычно не позволяет переименовывать открытый файл), то здесь абсолютно нет проблем: дескриптор открытого файла просто считается жесткой ссылкойк данным файла.

Эти данные переименованного файла каким-то образом не отсоединяются от дескриптора открытого файла - рассматривайте последний как своего рода «анонимную» ссылку на эти данные.

Комуcite руководство close(2) :

Если счетчик ссылок файла равен 0, когда все файловые дескрипторы, связанные с файлом, закрыты, пространство, занимаемое файлом, должнобудет освобожден, и файл больше не будет доступен.

...