【发布时间】:2020-05-13 20:13:37
【问题描述】:
在 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 输出。我不希望它们结合在一起。
提前谢谢你。
【问题讨论】:
-
在 Go 中做并发事情的方法是使用 goroutines。但是为什么不像examples 中的assign
io.WriterstoStdoutandStderr(它会自动为你处理goroutines)呢? -
我正试图弄清楚如何做到这一点。我是Go新手,所以请原谅我的无知。确切地说,我将在 cmd.Stdout 和 cmd.Stderr 中放入什么来为它们分配 io.Writers,以及在程序完成后我将如何捕获字节?
-
文档中的链接示例正是这样做的。
-
谢谢大家。我最初错过了链接的示例,现在我更好地理解了 goroutines。