2011-11-28 13 views
16

Sto cercando di riavviare il mio programma, ma niente sembra funzionare. Ho provato a utilizzare fork(), ma dopo aver ucciso ilparent processo ilchild viene ucciso anche.Come fare un programma per riavviarsi da solo? (Processo Linux)

CODICE

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; 
} 

risposta

13

Perché perdere tempo con la fork se si sta solo andando a killilparent? Basta fare il exec. La nuova istanza del programma sarà ancora la stessa procedura, ma verrà effettivamente riavviata.

+0

Produce programma 2 iniziato. Il programma 2 è iniziato. con execve semplice ("prog2", NULL); Questo mi ha confuso. Non dovrebbe visualizzare "Programma 2 terminato"? – bvk256

+0

Non chiamerà mai "Programma 2 terminato" perché il genitore ha già terminato se stesso con kill (getpid(), ...); –

+0

Ok, allora. In ogni caso questo messaggio è facilmente ottenibile posizionandolo nei luoghi in cui è garantito il completamento di un processo. – bvk256

3

Utilizzare 2 livelli di biforcazione. Un'app di "monitoraggio" dei genitori che stacca i bambini e ne monitora lo stato. Se un bambino muore, il monitor ne avvia uno nuovo. I bambini poi fanno il loro proprio biforcarsi per fare qualunque cosa debbano fare.

Tuttavia, se non è necessario che la 'nuova' copia dell'app abbia lo stesso stato di quella che viene uccisa, utilizzare exec() per avviare una nuova copia indipendente è probabilmente un'opzione migliore, risparmiando devi avere quella copia del monitor seduta in giro.

Problemi correlati