2011-11-28 12 views
16

Estoy intentando que mi programa se reinicie solo, pero parece que nada funciona. Intenté usar fork(), pero después de matar el procesoparentelchild se mata también.¿Cómo hacer que un programa se reinicie solo? (Proceso de Linux)

CÓDIGO

void sigup_handler(int signum) { 
    int pid = fork(); 
    if (pid == 0) { 
     execve("prog2", NULL); 
    } 
    else 
     kill(getpid(), SIGTERM); 
} 

int main() { 
    puts("Program 2 started."); 
    signal(SIGHUP, sigup_handler); 
    sleep(50); 
    puts("Program 2 terminated."); 
    return 0; 
} 

Respuesta

13

Por qué molestarse con el fork si sólo vamos a killlaparent? Solo haz el exec. La nueva instancia del programa seguirá siendo el mismo proceso, pero se reiniciará de manera efectiva.

+0

Genera Programa 2 comenzó. El programa 2 comenzó. con simple execve ("prog2", NULL); Esto me confundió. ¿No debería mostrar "Programa 2 terminado"? – bvk256

+0

Nunca llamará "Programa 2 terminado" porque el padre ya se ha terminado con kill (getpid(), ...); –

+0

Ok, entonces. De todos modos, este mensaje se puede lograr fácilmente ubicándolo en los lugares donde se garantiza que terminará un proceso. – bvk256

3

Utilice 2 niveles de bifurcación. Una aplicación de "monitor" para padres que saca a los niños y supervisa su estado. Si un niño muere, el monitor inicia uno nuevo. Luego, los niños hacen su propio bifurcación para hacer lo que sea que tengan que hacer.

Sin embargo, si no necesita que la 'nueva' copia de la aplicación tenga el mismo estado que la que se está eliminando, entonces es probable que usar exec() para iniciar una nueva copia independiente sea una mejor opción, ahorrando tienes que tener esa copia del monitor sentada.

Cuestiones relacionadas