你在学习golang相关的知识吗?本文《如何在 Golang 程序中运行二进制文件并通过发送一些输入并等待输出来保持与其交互?》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!
问题内容
如何在 golang 程序中运行二进制文件并通过发送一些输入并等待输出来保持与它的交互?在我所做的事情中,我只运行了一次。我想保持这个二进制文件运行并与其交互,我不想多次运行它。
package main
import (
"os/exec"
"bytes"
"fmt"
)
func main() {
command := exec.Command("./program")
var output bytes.Buffer
command.Stdout = &output
command.Run()
result := output.String()
IV := result[:4]
cipher := result[5:]
cipher = cipher[:len(cipher)-1]
fmt.Printf("%v", result)
fmt.Printf("%v", IV)
fmt.Printf("%v", cipher)
}
解决方案
我认为实现此目的的正确方法是使用 exec.cmd 的 stdinpipe 和 stdoutpipe 方法。
参见 https://golang.org/pkg/os/exec/#Cmd.StdinPipe 等中的示例
下面是一个调用 bc 命令(内置计算器,从 stdin 进行计算并将结果发送到 stdout)并与其进行一些交互的示例:
package main
import (
"bufio"
"fmt"
"log"
"os/exec"
)
func main() {
cmd := exec.Command("bc", "-q")
stdin, err := cmd.StdinPipe()
if err != nil {
log.Fatal(err)
}
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Fatal(err)
}
if err := cmd.Start(); err != nil {
log.Fatal(err)
}
stdin.Write([]byte("2 + 2\n"))
r := bufio.NewReader(stdout)
b, err := r.ReadBytes('\n')
if err != nil {
log.Fatal(err)
}
fmt.Println("Read:", string(b))
}
在真实的程序中,您可能希望在 goroutine 中运行这个东西,这样它就不会阻塞应用程序的其余部分,发生在后台,等等。