我有一个需要 100 秒才能运行的 child_process。 “主”程序将产生 child_process 并等待它完成,或者提前终止它。
这是主程序的代码片段。它对进度进行 fmt.Println
并使用 goroutine 检查其 stdin
。一旦接收到“terminate”,master 就会将消息传递给 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”函数用于主程序和子进程。它从标准输入接收“终止”消息。
//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。
最佳答案
您可以使用 syscall.Kill
向子进程发送信号,前提是您拥有其 pid。例如:
syscall.Kill(cpid, syscall.SIGHUP)
当然,以上是 *nix 特定的。
关于go - 如何使用 golang goroutine 中断子进程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18640715/