2013-09-05 2 views
3

У меня есть child_process, для выполнения которого требуется 100 секунд. Программа «master» будет порождать дочерний_процесс и либо ждет его завершения, либо завершает его раньше.как прервать дочерний процесс с golang goroutine

Вот фрагмент кода основной программы. Это fmt.Println прогресс и проверить его stdin с goroutine. Как только «завершение» получено, мастер передает сообщение дочернему_процессу, чтобы прервать его.

//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 и chan.

Мой вопрос в том, есть ли лучший способ сигнализировать/убивать/прерывать 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)'. Однако вы должны подумать о том, чтобы убить его, если он не закончится сам после отправки прерывания –

Смежные вопросы