2016-02-10 11 views
5

Ho bisogno del mio programma per eseguire qualche altro programma, ma se l'altro programma non ritorna entro un certo limite di tempo, ho bisogno di ucciderlo. Ho trovato la seguente soluzione che sembra funzionare.Un modo migliore per monitorare e uccidere il processo in stallo di un altro programma in Linux?

int main() 
{ 
int retval, timeout=10; 
pid_t proc1=fork(); 

if(proc1>0) 
{ 
    while(timeout) 
    { 
     waitpid(proc1, &retval, WNOHANG); 
     if(WIFEXITED(retval)) break; //normal termination 
     sleep(1); 
     --timeout; 
     if(timeout==0) 
     { 
      printf("attempt to kill process\n"); 
      kill(proc1, SIGTERM); 
      break; 
     } 
    } 
} 
else if(proc1==0) 
{ 
    execlp("./someprogram", "./someprogram", "-a", "-b", NULL); 
} 
//else if fork failed etc. 
return 0; 
} 

ho bisogno del mio programma di essere il più robusto possibile, ma io sono nuovo di programmazione sotto linux in modo da non essere a conoscenza di eventuali problemi con esso. Le mie domande sono: 1. Questa è una soluzione adeguata a questo particolare problema o ci sono metodi migliori? 2. Qualcuno vede possibili problemi o bug che possono portare a un comportamento imprevisto o una perdita di risorse di sistema?

risposta

2

(WIFEXITED(retval)) non restituisce true se il programma viene ucciso da un segnale (incluso dire un arresto anomalo a causa della violazione della segmentazione).

Probabilmente la cosa migliore è semplicemente verificare il corretto ritorno da waitpid. Ciò avverrà solo se il programma è terminato (volontariamente o meno).

A seconda di quanto sia importante per assicurarsi che il processo è andato ...
Dopo aver ucciso il processo con SIGTERM, si poteva dormire un altro secondo o così e se è ancora andato, utilizzare SIGKILL per essere sicuri.

+0

Grazie per i suggerimenti. Quindi, secondo le sue specifiche 'waitpid' con 'WNOHANG' restituirà> 0 valore quando il processo figlio avrà "stato modificato". Questo significa che questo "cambio di stato" può avvenire solo alla fine del processo? – vapid

+0

Per i vostri scopi, l'unico cambiamento di stato sarà quando il processo termina. Gli altri usi entrano in gioco solo se (a) si sta scrivendo un debugger (cioè usando 'ptrace (2)') o (b) se si specificano i flag 'WUNTRACED' o' WCONTINUED', nel qual caso si essere informato quando c'è un segnale di stop (ad es. Ctrl-Z) o un continuo-da-stop. –

Problemi correlati