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

在 Go 版本 1.14.2 中,以下是一些示例代码,它说明了生成命令、通过标准输入向其提供数据、然后捕获其标准输出和标准错误的常用方法。它使用管道,但是如果 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 输出。我不希望它们结合在一起。


先感谢您。


跃然一笑
浏览 215回答 2
2回答

Cats萌萌

让 exec 包为您完成工作。var stdout, stderr bytes.Buffercmd.Stdout = &stdoutcmd.Stderr = &stderrcmd.Stdin = bytes.NewReader(*input)err := cmd.Run()stdoutBytes := stdout.Bytes()stderrBytes := stderr.Bytes()exec 包创建和管理将数据泵入和输出子进程所需的 goroutine。

慕妹3242003

在 goroutine 中读取一个(或两个)流:var stderrBytes []bytego func() {  stderrBytes, _ = ioutil.ReadAll(stderr)}()err = cmd.Start()stdoutBytes, err := ioutil.ReadAll(stdout)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go