假设
stdout
是的结果
cmdObject.StdoutPipe()
,在进程退出后等待时,读取器应关闭读取器并中断任何正在进行的读取。
Wait将在看到命令退出后关闭管道,因此大多数调用方不需要自己关闭管道。
所以,我们需要在一个单独的goroutine中终止这个过程,然后
Wait
杀死过程后,观察它的发生并关闭阅读器。
// code that start the process...
scanner := bufio.NewScanner(stdout)
go func() {
<-processFinishChan: // send to this channel to terminate the process
log.Println("Killing Process")
err := cmdObject.Process.Kill()
if err != nil {
log.Printf("Error Killing: %v", err)
}
cmdObject.Wait()
} ()
for {
// default case, read the output of process and send to user.
if !scanner.Scan() && scanner.Err() == nil {
// reach EOF
return
}
m := scanner.Bytes()
WSOutChanHolder.mu.Lock()
for _, ch := range WSOutChanHolder.data {
ch <- m
}
WSOutChanHolder.mu.Unlock()
}