PDA

Visualizza la versione completa : [C] Fork e riavvio processo


MaxGuevara
28-05-2012, 09:51
Ciao!


Sto facendo un progetto per la scuola che mi chiede di creare, tramite fork, dei processi figlio che avviino un terminale unix ognuno, e fin qui ci sono.
Mi blocco pero' quando mi viene chiesto che il processo figlio venga riavviato nel momento in cui il terminale aperto venga chiuso(mentre il processo padre e' ancora aperto ed attivo).

Il codice,grossolanamente, e' cosi':


pid = fork()
if (pid == 0)
{
//processo figlio
}
else
{
//processo padre
}



Come posso implementare?

Who am I
28-05-2012, 14:02
Mi blocco pero' quando mi viene chiesto che il processo figlio venga riavviato nel momento in cui il terminale aperto venga chiuso(mentre il processo padre e' ancora aperto ed attivo).


Riavviare un processo? Cosa intendi? :confused:

MaxGuevara
31-05-2012, 00:49
col fork eseguo un comando che apre un terminale e questo terminale deve rimanere aperto finche' l'utente non preme INVIO.
Nel momento in cui uno dei terminali viene chiuso(senza premere INVIO) il processo padre deve riavviarlo.In pratica deve monitorare che non venga chiuso e nel caso venisse chiuso lo deve riavviare.

Mond0
31-05-2012, 10:02
potresti lavora con la funzione signal().
tipo:


signal(SIGHUP, gestione_segnale);
// questo per gestire l'evento di quando chiudi la shell cliccando sulla x

void gestione_segnale(int segnale_ricevuto){
// gestione segnale
}

Who am I
31-05-2012, 16:38
Quando esegui la exec per lanciare il processo che lancia il terminale, il pid del processo non cambia.Per cui quando la shell si chiude il programma lanciato con la exec termina e puoi benissimo usare la funzione waitpid per aspettare che tale processo termini.Se termina ne puoi creare uno nuovo.

MaxGuevara
31-05-2012, 17:40
Grazie,anzitutto,per le risposte.

Sono riuscito con il waitpid ad aspettare che la shell terminasse e riavviarla,c'e' pero' un problema...me le avvia una per volta ,mentre la consegna dice che devono essere avviati tutti contemporaneamente i processi figli.

Per esempio, se scrivo cosi':


for(i=1; i <= argc; i++)
{

pid = fork();
if ( pid == 0)
{
cmd = argv[i];
strcat(cmd,";read");
execl("/usr/bin/xterm","/usr/bin/xterm","-e",cmd,(char *)0);
}
else{


}



Mi avvia tutti i terminali contemporaneamente.

Se invece aggiungo il waitpid:




for(i=1; i <= argc; i++)
{

pid = fork();
if ( pid == 0)
{
cmd = argv[i];
strcat(cmd,";read");
execl("/usr/bin/xterm","/usr/bin/xterm","-e",cmd,(char *)0);
}
else{
waitpid(-1,&pid,0);
i--;

}


Me li riavvia se si chiudono ma li esegue uno alla volta.Come faccio ad avviarli tutti assieme pur mantenendo la possibilita' di riavviarli in caso di chiusura?

Who am I
31-05-2012, 21:39
Puoi benissimo risolvere questo problema utilizzando un' altra fork() .
Per ogni terminale utilizzi 2 processi, uno che esegue la execl ed un altro che aspetta che quest' ultimo termini e appena termina ne lancia uno nuovo:



for(i=1; i <= argc; i++)
{
pid = fork();
if ( pid == 0)
{
while(1)
{
// il loop indefinito puņ causare problemi, utilizza la signal per
// gestire la terminazione di ogni processo.
pid=fork();
if(!pid)
{
cmd = argv[i];
strcat(cmd,";read");
execl("/usr/bin/xterm","/usr/bin/xterm","-e",cmd,(char *)0);
}
else
{
waitpid(-1,&pid,0);
}
}
}
}

Loading