go - 运行命令时如何从 Go 读取附加文件描述符

标签 go

假设我有一个程序,可以在文件描述符 3 上输出内容;像这样的东西:

package main

import "os"

func main() {
    fd3 := os.NewFile(3, "fd3")
    fd3.Write([]byte("FOOBAR\n"))
    fd3.Close()
}

现在,我想从 Go 程序获取发送到文件描述符 3 的输出:

package main

import (
    "bufio"
    "fmt"
    "os/exec"
    "os"
)

func main() {
    cmd := exec.Command("./client")
    cmd.Stderr = os.Stderr
    fd3 := os.NewFile(3, "fd3")
    defer fd3.Close()

    cmd.ExtraFiles = []*os.File{fd3}

    err := cmd.Start()
    if err != nil {
        panic(err)
    }

    go func() {
        for {
            reader := bufio.NewReader(fd3)
            line, err := reader.ReadString('\n')
            if err != nil {
                panic(err)
            }
            fmt.Print(line)
        }
    }()


    cmd.Wait()

    fmt.Println("--- END ---")
}

但这不起作用,因为它输出以下错误:

panic: read fd3: bad file descriptor

我不明白我的代码出了什么问题。有谁愿意帮忙吗?

最佳答案

os.NewFile 实际上并不打开文件描述符。它实际上是一个 API,用于包装提供给您的 fd。

查看 godoc:http://golang.org/pkg/os/#Create (单击名称“创建”,当前指向 this )

我认为你想调用 os.Create(name) 并将 fd 传递给子进程 或者潜在的 os.Open/os.OpenFile 如果您需要设置模式和内容

关于go - 运行命令时如何从 Go 读取附加文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23579024/

相关文章:

go - 在 Go 中使用 c 风格迭代器的惯用方式

json - Golang map : How to strip out empty fields automatically

go - 接受 interface{} 参数的函数如何通过引用更新调用它的值?

go - 用于 Sublime 的 MarGo

go - 使用整数作为小数系数而不是 float 对于货币应用来说是个好主意吗?

go - 从数据 golang slice 初始化创建 Struct 实例

amazon-web-services - 更新前读取 k8s Controller 运行时

go - 嵌套依赖注入(inject)在 golang 中是否可以接受?

regex - 有什么方法可以在正则表达式中转义 Go 字符串?

unit-testing - 如何模拟函数以在golang中获得不同的返回值