如何在go中清除close-on-exec标志?

时间:2014-10-20 15:03:47

标签: go

在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标志?

1 个答案:

答案 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)
    }