我正在尝试从 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我错过了什么让我无法阅读输出?
3 回答
当年话下
TA贡献1890条经验 获得超9个赞
您可能需要检查多项内容。
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) {
// Scanning code
// ...
stop<-true
}
和主要代码为:
stop := make(chan bool)
go readStuff(scanner,stop)
<-stop
cmd.Wait()
慕田峪7331174
TA贡献1828条经验 获得超13个赞
看来你不需要
go readStuff(scanner)
因为
cmd.Start()
做系统 fork 本身就这么简单
readStuff(scanner)
对我来说就足够了(不会为此产生 gorouting)
- 3 回答
- 0 关注
- 265 浏览
添加回答
举报
0/150
提交
取消