假设我有一个程序,可以在文件描述符 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/