gpt4 book ai didi

go - Go:如何通过os.exec执行命令时防止管道阻塞?

转载 作者:行者123 更新时间:2023-12-01 22:30:42 26 4
gpt4 key购买 nike

在Go版本1.14.2中,以下是一些示例代码,这些代码说明了产生命令,通过stdin向其馈送数据,然后捕获其stdout和stderr的常用方法。它利用管道,但是如果在过程完成之前stdout或stderr管道的缓冲区已满,这可能导致程序阻塞(在此示例中省略了错误处理)...

func ExecExample(cmd *exec.Cmd, input *[]byte) {
stdout, err := cmd.StdoutPipe()
stderr, err := cmd.StderrPipe()
stdin, err := cmd.StdinPipe()
err = cmd.Start()
stdin.Write(*input)
stdin.Close()
stdoutBytes, err := ioutil.ReadAll(stdout)
stderrBytes, err := ioutil.ReadAll(stderr)
waitErr := cmd.Wait()
}

如何在Go中重组此示例代码,以使stdout和stderr管道永远不会阻塞?

另外,请注意,我正在寻找一种单独捕获stdout和stderr输出的方法。我不希望将它们合并。

先感谢您。

最佳答案

让exec包为您完成工作。

var stdout, stderr bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = &stderr
cmd.Stdin = bytes.NewReader(*input)
err := cmd.Run()
stdoutBytes := stdout.Bytes()
stderrBytes := stderr.Bytes()

exec程序包创建和管理将数据泵入子进程或从子进程中抽取数据所需的goroutine。

Run it in the playground

关于go - Go:如何通过os.exec执行命令时防止管道阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61783991/

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