FNF-fabius
04-09-2008, 15:48
Salve a tutti,
ho un problema riguardante la gestione dei segnali sotto Unix.
A partire da un processo padre che si forka n volte devo tramite segnali mettere in pausa il padre stesso e tutti gli n figli attivi in un dato istante. La pausa deve essere lunga un numero di secondi arbitrario, a discrezione dell'uutente.
Io ho impostato in C le seguenti righe di codice ma c'e' qualcosa ke mi sfugge, i processi vanno in pausa ma al momento di riprendere l'attivita' il programa termina al posto di continuare dal punto in cui si era fermato.
nel processo padre inserisco un gestore di SIGTSTP esattamente prima di iniziare il ciclo di fork degli intermediari - signal (SIGTSTP, gest1);
il segnale viene cosi' gestito dal processo padre
scanf("%d",&pausa); //si legge il numero arbitrario di secondi per la pausa
killpg(INTERM,SIGSTOP); //mando un SIGSTOP ai processi figli che ho radunato sotto il gruppo INTERM
sighold(SIGALRM);
alarm(pausa);
sigpause(SIGALRM);
//metto in pausa il padre in attesa di un SIGALRM
//e invio un SIGALRM dopo "pausa" secondi
killpg(INTERM,SIGCONT);
//infine quando il padre e' risvegliato da SIGALRM invia un SIGCONT ai processi figli affinche' riprendano l'esecuzione.
Un problema che ho rilevato e' che non riesco nel codice dei processi figli ad impostare correttamente il gruppo:
int group=setpgid(getpid(), INTERM);//assegno il groupID
questa ritorna sempre -1. Qualcuno sa dirmi come mai?
C'e' un'altra forma per raggruppare processi in modo da inviare un segnale a tutto un gruppo?
Grazie
ho un problema riguardante la gestione dei segnali sotto Unix.
A partire da un processo padre che si forka n volte devo tramite segnali mettere in pausa il padre stesso e tutti gli n figli attivi in un dato istante. La pausa deve essere lunga un numero di secondi arbitrario, a discrezione dell'uutente.
Io ho impostato in C le seguenti righe di codice ma c'e' qualcosa ke mi sfugge, i processi vanno in pausa ma al momento di riprendere l'attivita' il programa termina al posto di continuare dal punto in cui si era fermato.
nel processo padre inserisco un gestore di SIGTSTP esattamente prima di iniziare il ciclo di fork degli intermediari - signal (SIGTSTP, gest1);
il segnale viene cosi' gestito dal processo padre
scanf("%d",&pausa); //si legge il numero arbitrario di secondi per la pausa
killpg(INTERM,SIGSTOP); //mando un SIGSTOP ai processi figli che ho radunato sotto il gruppo INTERM
sighold(SIGALRM);
alarm(pausa);
sigpause(SIGALRM);
//metto in pausa il padre in attesa di un SIGALRM
//e invio un SIGALRM dopo "pausa" secondi
killpg(INTERM,SIGCONT);
//infine quando il padre e' risvegliato da SIGALRM invia un SIGCONT ai processi figli affinche' riprendano l'esecuzione.
Un problema che ho rilevato e' che non riesco nel codice dei processi figli ad impostare correttamente il gruppo:
int group=setpgid(getpid(), INTERM);//assegno il groupID
questa ritorna sempre -1. Qualcuno sa dirmi come mai?
C'e' un'altra forma per raggruppare processi in modo da inviare un segnale a tutto un gruppo?
Grazie