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?
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
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. –