【问题标题】:how do I clear the close-on-exec flag in go?如何清除 go 中的 close-on-exec 标志?
【发布时间】:2014-10-20 15:03:47
【问题描述】:

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

【问题讨论】:

    标签: go


    【解决方案1】:

    我在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)
        }
    

    【讨论】:

      猜你喜欢
      • 2010-12-11
      • 2010-11-12
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 2013-06-03
      相关资源
      最近更新 更多