Inherited file descriptor is encapsulated into a File using os.NewFile(). There is no dup() done by Go in this case and a finalizer will close the File (and the file descriptor if the file wasn't already closed) when it becomes out of reach. Using syscall.Close() will close the file descriptor but not the File. At some point, the finalizer will kick in, notice the file hasn't been closed and close again the file descriptor. If the file descriptor was reassigned to something else, we close an unrelated file descriptor.
Tested with Go 1.7. Source code shows there is no dup() done when using NewFile():
Inherited file descriptor is encapsulated into a
File
usingos.NewFile()
. There is nodup()
done by Go in this case and a finalizer will close theFile
(and the file descriptor if the file wasn't already closed) when it becomes out of reach. Usingsyscall.Close()
will close the file descriptor but not theFile
. At some point, the finalizer will kick in, notice the file hasn't been closed and close again the file descriptor. If the file descriptor was reassigned to something else, we close an unrelated file descriptor.Tested with Go 1.7. Source code shows there is no
dup()
done when usingNewFile()
: