为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
跃然一笑 2022-06-01 18:07:15
在 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 输出。我不希望它们结合在一起。先感谢您。
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

让 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。


查看完整回答
反对 回复 2022-06-01
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

在 goroutine 中读取一个(或两个)流:


var stderrBytes []byte

go func() {

  stderrBytes, _ = ioutil.ReadAll(stderr)

}()


err = cmd.Start()

stdoutBytes, err := ioutil.ReadAll(stdout)


查看完整回答
反对 回复 2022-06-01
  • 2 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号