実行に 100 秒かかる child_process があります。「マスター」プログラムは child_process を生成し、それが終了するのを待つか、早期に終了します。
マスター プログラムのコード スニペットを次に示します。fmt.Println
進行状況を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 の両方で使用されます。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"
}
}
}
現在、ゴルーチンとちゃんで動作します。
私の質問は、child_process をシグナル/キル/中断するためのより良い方法があるかどうかです。