1 回答

TA貢獻1842條經驗 獲得超13個贊
讀取到 stdout 末尾后調用 cmd.Wait()。
選項 1:在 scanner.Scan() 返回 false 后從主 goroutine 調用 cmd.Wait。
cmd := exec.Command("sh", "-c", "bc")
stdin, _ := cmd.StdinPipe()
stdout, _ := cmd.StdoutPipe()
scanner := bufio.NewScanner(stdout)
cmd.Start()
io.WriteString(stdin, "1 + 2\n")
fmt.Println(scanner.Scan(), scanner.Text())
io.WriteString(stdin, "3 + 4\n")
fmt.Println(scanner.Scan(), scanner.Text())
io.WriteString(stdin, "5 + 6\n")
io.WriteString(stdin, "quit\n") // cmd.Wait() runs
fmt.Println(scanner.Scan(), scanner.Text())
fmt.Println(scanner.Scan(), scanner.Text()) // prints false
cmd.Wait()
選項 2:從等待的 goroutine 中讀取:
cmd := exec.Command("sh", "-c", "bc")
stdin, _ := cmd.StdinPipe()
stdout, _ := cmd.StdoutPipe()
scanner := bufio.NewScanner(stdout)
cmd.Start()
var wg sync.WaitGroup
wg.Add(1)
go func() {
for scanner.Scan() {
fmt.Println(scanner.Text())
}
cmd.Wait()
defer wg.Done()
}()
io.WriteString(stdin, "1 + 2\n")
io.WriteString(stdin, "3 + 4\n")
io.WriteString(stdin, "5 + 6\n")
io.WriteString(stdin, "quit\n") // cmd.Wait() runs
wg.Wait()
- 1 回答
- 0 關注
- 170 瀏覽
添加回答
舉報