如何在运行命令时读取Go附加文件描述符
假设我有一个程序,它在文件描述符3上输出东西;大概是这样的:如何在运行命令时读取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"
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
显示权限被拒绝。