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

时间:2014-05-10 08:51:44

标签: 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

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

1 个答案:

答案 0 :(得分:3)

os.NewFile实际上并没有打开文件描述符。它真的是一个包装给你的fd的API。

看看godoc:http://golang.org/pkg/os/#Create (单击名称Create,当前指向this

我想你想调用os.Create(name)并将fd传递给子进程 或者如果你需要设置模式和东西,可以使用os.Open / os.OpenFile