从子进程读取 Stdout

我正在尝试从 Golang 生成一个子进程。目标是逐行读取和处理输入。这是我试图开始工作的内容:


func readStuff(scanner *bufio.Scanner) {

    for scanner.Scan() {

        fmt.Println("Performed Scan")

        fmt.Println(scanner.Text())

    }

    if err := scanner.Err(); err != nil {

        fmt.Fprintln(os.Stderr, "reading standard input:", err)

    }

}


func main() {

    cmd := exec.Command("/usr/local/bin/pocketsphinx_continuous", "-inmic", "yes")

    out, err := cmd.StdoutPipe()


    err = cmd.Start()

    checkError(err)


    scanner := bufio.NewScanner(out)

    fmt.Println("Scanner created")


    defer cmd.Wait()

    go readStuff(scanner)

}

在此示例中,打印了“已创建扫描仪”,但之后没有任何反应。


但是,运行此命令确实会导致我期望打印到的内容:


/usr/local/bin/pocketsphinx_continuous -inmic yes 1>out.txt

并修改代码以直接复制到stdout工作以及:


cmd := exec.Command("/usr/local/bin/pocketsphinx_continuous", "-inmic", "yes")

cmd.Stdout = os.Stdout

我错过了什么让我无法阅读输出?


慕尼黑8549860
浏览 266回答 3
3回答

当年话下

您可能需要检查多项内容。cmd.StdoutPipe()不检查由 返回的错误代码。它应该是。该pocketsphinx_continuous命令需要提供-hmm和-dict参数。否则,它将失败,并且所有输出实际上都发送到stderr而不是stdout。在这里,您只阅读stdout,但没有什么可阅读的。cmd.Wait()在确定所有数据都已从 中读取之前,您不应调用stdout。结果是不确定的(实际上,这是一个竞争条件)。检查有关os/exec包的文档。如果绝对需要在 goroutine 中进行解析,则需要在cmd.Wait()调用前与 goroutine 的末尾同步。例如,您可以将函数编写为:func readStuff(scanner *bufio.Scanner, stop chan bool) {&nbsp; &nbsp; // Scanning code&nbsp; &nbsp; // ...&nbsp; &nbsp; stop<-true}和主要代码为:stop := make(chan bool)go readStuff(scanner,stop)<-stopcmd.Wait()

慕田峪7331174

看来你不需要go&nbsp;readStuff(scanner)因为cmd.Start()做系统 fork 本身就这么简单readStuff(scanner)对我来说就足够了(不会为此产生 gorouting)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go