在Centos6上调用os.OpenFile时,会在文件句柄上设置O_CLOEXEC标志。我不认为有可能避免设置旗帜。例如,以下调用:
f, err := os.OpenFile( "lockfile", os.O_CREATE|os.O_RDWR, 0666 )
在strace中看起来像这样:
[pid 2928] open("lockfile", O_RDWR|O_CREAT|O_CLOEXEC, 0666) = 3
syscall.CloseOnExec用于设置给定文件句柄的close-on-exec标志,但是我找不到用于清除close-on-exec标志的相应函数。
如何清除文件的close-on-exec标志?
答案 0 :(得分:3)
我在https://golang.org/src/pkg/syscall/exec_linux.go中找到了一个提示:
_, _, err1 = RawSyscall(SYS_FCNTL, uintptr(fd[i]), F_SETFD, 0)
if err1 != 0 {
goto childerror
}
在其他地方,我读过我应该使用Syscall rather than RawSyscall,所以我把它重写为:
_, _, err = syscall.Syscall(syscall.SYS_FCNTL, f.Fd(), syscall.F_SETFD, 0)
if err != syscall.Errno(0x0) {
log.Fatal(err)
}