戈朗啦啦.在内部读取源中复制块

  • 本文关键字:复制 读取 在内部 go
  • 更新时间 :
  • 英文 :


我正在 golang 构建一个终端模拟器,我正在尝试运行分离的进程,我可以从中复制输出并将其显示给用户,但 io。复制功能块,因此我无法继续输出部分

我查看了源代码,它在内部 ReadFrom 方法中阻塞,我不明白为什么会发生这种情况

package main
import (
"bytes"
"fmt"
"io"
"os"
)
func main() {
inputReader, inputWriter, _ := os.Pipe()
outputReader, outputWriter, _ := os.Pipe()
io.Copy(inputWriter, bytes.NewReader([]byte("n")))
stdin := inputReader
stdout := outputWriter
stderr := outputWriter
var attr = os.ProcAttr{
Dir: "/tmp",
Env: nil,
Files: []*os.File{
stdin,
stdout,
stderr,
},
Sys: nil,
}
process, startProcessErr := os.StartProcess("/usr/bin/ls", []string{"ls"}, &attr)
if startProcessErr != nil {
panic(startProcessErr)
}
if releaseProcessErr := process.Release(); releaseProcessErr != nil {
panic(releaseProcessErr)
}
var output bytes.Buffer
io.Copy(&output, outputReader)
fmt.Println(output)
}

也许是因为我发布了该过程,但我认为它不应该发生

调用io.Copy(&output, outputReader)阻塞,直到读取outputReader返回EOF或其他错误。 继续读取outputReader不会返回 EOF,因为管道的写入端在父进程中仍处于打开状态。 通过关闭父进程中的编写器进行修复。

...
if releaseProcessErr := process.Release(); releaseProcessErr != nil {
panic(releaseProcessErr)
}
outputWriter.Close() // <-- add this line
var output bytes.Buffer
io.Copy(&output, outputReader)
fmt.Println(output)
...

使用 os/exec 包来简化代码:

cmd := exec.Command("/usr/bin/ls")
cmd.Dir = "/tmp"
output, err := cmd.CombinedOutput()
if err != nil {
log.Fatal(err)
}
fmt.Println(string(output))

最新更新