问题描述
我有一个永远循环的二进制文件,每毫秒返回一个输出(吓死了,我知道)。我想通过Go调用它。问题是,(据我所知),Go在显示输出之前将等待命令完成。就我而言,命令在被杀死之前不会完成(我也想通过停止Go程序来停止二进制文件)。这是我所拥有的:
func main(){
loggerInit := exec.Command("/logger")
var out Bytes.Buffer
loggerInit.Stdout = &out
err = loggerInit.Run()
if err != nil {
fmt.Println(err)
}
fmt.Printf(out.String())
}
但这不会产生任何输出,并且会一直保留在命令中(实际上,手动运行/logger
确实会提供所需的输出)。谢谢,加油!
解决方法
您正在使用Run
:
运行会启动指定的命令,并等待其完成。
根据您的描述,您应该在哪里使用Start
:
启动将启动指定的命令,但不等待其完成。
但是,当然,您需要调整代码以等待或循环等,否则您的应用程序将在第一次读取任何输出后立即退出。
,我认为您可以使用此命令通过Go传递记录器的输出
./logger | main.go
这意味着,记录器产生了一些东西(例如,字节/字符串),然后Go将该输出读取为输入。
main.go
buf := make([]byte,expectedBytes)
for {
bytes,_ := io.ReadFull(os.Stdin,buf)
// do it here
time.Sleep(1 * time.Second)
}
对不起,我的英语希望对您有所帮助。