如何使用golang goroutine中断子进程

时间:2013-09-05 15:46:29

标签: go

我有一个需要100秒才能运行的child_process。 “master”程序将生成child_process并等待它完成,或者提前终止它。

这是主程序的代码片段。它fmt.Println进度并用goroutine检查其stdin。收到“terminate”后,主服务器将消息传递给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”函数在master程序和child_process中使用。它从标准输入接收“终止”消息。

//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和chan。

我的问题是是否有更好的方法来发信号/杀死/中断child_process。

1 个答案:

答案 0 :(得分:0)

您可以使用syscall.Kill向您提供pid的子进程发送信号。例如:

syscall.Kill(cpid, syscall.SIGHUP)

当然,以上是* nix特定的。