gpt4 book ai didi

go - 为什么我在使用 stderr 和 ioutil.ReadAll 的 Go 程序中得到 "bad file descriptor"

转载 作者:IT王子 更新时间:2023-10-29 01:13:09 25 4
gpt4 key购买 nike

命令“psql”应该抛出一个错误,我正在尝试读取 stderr 并在 Go 程序中打印它。我使用 ioutil.ReadAll 从 stderr 和 stdout 读取数据。

不幸的是,它根本没有从 stderr 读取。 ioutil.ReadAll 返回一个错误,这不是我预期的错误。

我得到的错误是

read |0: bad file descriptor

这是代码。

package main

import (
"fmt"
"os/exec"
"io/ioutil"
)

func main() {
cmd := exec.Command("psql")
stdout, err := cmd.StdoutPipe()
if err != nil {
fmt.Printf("Error: %s", err)
}
stderr, err := cmd.StderrPipe()
if err != nil {
fmt.Printf("Error: %s", err)
}
err = cmd.Start()
if err != nil {
fmt.Printf("Start error %s",err)
}

d := cmd.Wait()
if d != nil {
fmt.Println(d)
}

stdo,g := ioutil.ReadAll(stdout)
stde,f := ioutil.ReadAll(stderr)

if g != nil {
fmt.Println(g)
}

if f !=nil {
fmt.Println(f)
}

fmt.Printf("Standard err is %s \n", stde)
fmt.Printf("Standard out is %s \n",stdo)
}

最佳答案

我发现通过实验我得到了错误,因为我正在调用

   stdo,g := ioutil.ReadAll(stdout)
stde,f := ioutil.ReadAll(stderr)

之后

 d := cmd.Wait()

因此,在 cmd.Wait() 返回后,stdout、stderr 管道将关闭。

这里是cmd.StderrPipe()的代码注释

// StderrPipe returns a pipe that will be connected to the command's
// standard error when the command starts.
// The pipe will be closed automatically after Wait sees the command exit.

很明显我们无法在关闭后读取 stdout 和 stderr。

我们也无法在命令开始之前读取它们。所以我们必须将它们放在开始和等待之间。

这是解决这个问题的代码。

package main

import (
"fmt"
"os/exec"
"io/ioutil"
)

func main() {
cmd := exec.Command("psql")
stdout, err := cmd.StdoutPipe()
if err != nil {
fmt.Printf("Error: %s", err)
}
stderr, err := cmd.StderrPipe()
if err != nil {
fmt.Printf("Error: %s", err)
}
err = cmd.Start()
if err != nil {
fmt.Printf("Start error %s",err)
}

stdo,g := ioutil.ReadAll(stdout)
stde,f := ioutil.ReadAll(stderr)

d := cmd.Wait()

if d != nil {
fmt.Println(d)
}

if g != nil {
fmt.Println(g)
}

if f !=nil {
fmt.Println(f)
}

fmt.Printf("Standard err is %s \n", stde)
fmt.Printf("Standard out is %s \n",stdo)
}

关于go - 为什么我在使用 stderr 和 ioutil.ReadAll 的 Go 程序中得到 "bad file descriptor",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20134095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com