假设我有一个程序而不是输出文件描述符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
我不明白我的代码有什么问题。有谁愿意帮忙吗?
答案 0 :(得分:3)
os.NewFile实际上并没有打开文件描述符。它真的是一个包装给你的fd的API。
看看godoc:http://golang.org/pkg/os/#Create (单击名称Create,当前指向this)
我想你想调用os.Create(name)并将fd传递给子进程 或者如果你需要设置模式和东西,可以使用os.Open / os.OpenFile