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

如何在运行命令时读取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"

假设我有一个程序,它在文件描述符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: (单击当前指向的名称“创建”)

我认为您需要调用os.Create(name)并将fd传递给子进程
如果您需要设置模式和内容

您似乎假设文件描述符是全局的,但它们是每个进程的。如果您想在两个进程中连接文件描述符,则需要在它们之间使用管道(在这种情况下,管道的一端复制到子进程中的fd 3)。如果我有一个程序(比如星号PBX),它在预定进程fd 3上向我提供特定数据(比如EAGI),该怎么办?如何读取与Golang当前流程相关的特定FD?我试图阅读
os.Open(fmt.Sprintf(“/proc/%d/fd/3”,os.Getpid())
,但我的
io.Reader
似乎对此有阻碍,文件上的
cat
显示
权限被拒绝。