如何清除字节。在Golang的exec.Command中设置为StdOut的缓冲区(b.Reset不起作用)

问题描述 投票:0回答:1

我正在尝试在GoLang中编写一个命令行应用程序包装程序,该程序包装程序公开了REST API以与所述应用程序进行交互并显示其输出。

基本上是在REST API服务器启动时,它应该启动一个保持运行状态的命令行应用程序(例如,仅[[Powershell.exe),并且应该能够与该应用程序交互并在被请求通过时显示其输出。 API。

到目前为止,服务器已启动,子进程也已启动,我能够向该进程发出命令并检索其输出。为了捕获进程的输出,我使用了一个附加到进程

Stdout

Stderrbytes.Buffer问题在于,输出缓冲区似乎正在增长为无限,并且无法清除它。在该缓冲区上运行“

。Reset()

”似乎已被完全忽略,并且始终显示完整的缓冲输出。
这里是代码:

package main import ( "bytes" "fmt" "log" "net/http" "os/exec" ) func main() { var c = exec.Command("powershell.exe") var b bytes.Buffer c.Stdout = &b c.Stderr = &b stdin, err := c.StdinPipe() if err != nil { log.Fatal(err) } http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Do stuff") }) http.HandleFunc("/clear", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Cleared") b.Reset() }) http.HandleFunc("/write", func(w http.ResponseWriter, r *http.Request) { stdin.Write([]byte("echo hi\n")) fmt.Fprintf(w, "OK") }) http.HandleFunc("/show", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, string(b.Bytes())) }) fmt.Println("SERVER 1 STARTING") c.Start() c.CombinedOutput() http.ListenAndServe(":8081", nil) fmt.Println("SERVER 1 STOPPED") }

因此,这里的预期行为是,当您调用“ 

/ write

”时,它将在子应用程序中执行“ echo hi”。 “ / show”将显示应用程序的输出缓冲区。和“ / clear”应清除输出缓冲区,以便在运行“ / write”,“ / clear”和“ / show”时,应该显示空字符串。但是在这种情况下,它一直显示从未清除的应用程序输出。
有趣的是,如果我通过

b.WriteString()]手动写入缓冲区,然后执行b.Reset()

,则该内容的确会被删除,但不会删除命令行应用程序中的内容。
有一些方法可以正确清除bytes.Buffer,将其附加到Stdout / Stderr吗?或者,是否可以通过某种方法将缓冲区限制为特定的行数?

我正在尝试在GoLang中编写一个命令行应用程序包装程序,该程序包装程序公开了REST API以与所述应用程序进行交互并显示其输出。基本上,当REST API服务器启动时,它应该...

go buffer exec stdout stdin
1个回答
1
投票
@@ JimB是正确的,这似乎是一个同步问题。它不是网络服务器,而是exec.Command的工作方式以及共享缓冲区的方式。

该程序可能有助于解释。它运行ping并每秒读取一次缓冲区,每次尝试重置缓冲区。 Ping每秒写入一次缓冲区。

© www.soinside.com 2019 - 2024. All rights reserved.