2013-09-05 119 views
3

我有一個需要100秒運行的child_process。 「主」程序會產生child_process並等待它結束,或者提前終止。如何中斷子進程與golang goroutine

這是主程序的代碼片段。它fmt.Println的進展和檢查stdin與goroutine。一旦收到「終止」,主人將消息傳遞給child_process以中斷它。

//master program 
message := make(chan string) 
go check_input(message) 

child_process := exec.Command("child_process") 
child_stdin := child_process.StdinPipe() 

child_process.Start() //takes 100 sec to finish 

loop: 
    for i=:1;i<=100;i++ { 
     select { 
      case <- message: 
       //end child process 
       child_stdin.Write([]byte("terminate\n")) 
       break loop 
      case <- time.After(1*time.Second): 
       fmt.Println(strconv.ItoA(i) + " % Complete") // update progress bar 


    } 
child_process.Wait() //wait for child_process to be interrupted or finish 

「check_input」函數用於主程序和child_process中。它從stdin收到「終止」消息。

//check_input function 
func check_input(msg chan string){ 
reader := bufio.NewReader(os.Stdin) 
    for { 
     line, err := reader.ReadString('\n') 

     if err != nil { 
     // You may check here if err == io.EOF 
     break 
     }  

     if strings.TrimSpace(line) == "terminate" { 
     msg <- "terminate" 
     } 
    } 

} 

它目前與goroutine和陳。

我的問題是是否有更好的方式來發信號/終止/中斷child_process。

回答

0

您可以使用syscall.Kill發送信號給子進程提供您有它的PID。例如:

syscall.Kill(cpid, syscall.SIGHUP) 

當然,以上是* nix具體的。

+2

'child_process.Process.Kill()'或'child_process.Process.Signal(os.Interrupt)'如果你想跨平臺...... –

+0

請允許我詢問child_process是否會得到kill信號,在被殺之前有時間清理自己。 –

+0

不是用kill,而是用'child_process.Process.Signal(os.Interrupt)'。但是,如果在發送中斷後某個時間沒有結束,則應該考慮將其消除 –