Necesito que mi programa ejecute algún otro programa, pero si el otro programa no regresa dentro de un límite de tiempo, necesito eliminarlo. Se me ocurrió la siguiente solución que parece estar funcionando.
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; }Necesito que mi programa sea lo más robusto posible, pero soy nuevo en la programación en Linux, por lo que es posible que no esté al tanto de los posibles problemas que pueda tener. Mis preguntas son: 1. ¿Es esta una solución adecuada para este problema en particular o existen mejores métodos? 2. ¿Alguien ve posibles problemas o errores que puedan provocar un comportamiento inesperado o una fuga de recursos del sistema?
(WIFEXITED(retval)) no devolverá verdadero si una señal elimina el programa (incluido, por ejemplo, un bloqueo debido a una infracción de segmentación).
Probablemente sea mejor verificar si el retorno de waitpid . Eso solo sucederá si el programa se cancela (ya sea voluntariamente o no).
Dependiendo de lo importante que sea asegurarse de que el proceso se haya ido...
Después de matar el proceso con SIGTERM , podría dormir otro segundo más o menos y, si aún no se ha ido, use SIGKILL para estar seguro.