|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Sep 2008
Messaggi: 1
|
[C] SEGNALI mettere in pausa un gruppo di processi
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 |
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 20
|
salve a tutti
ho lasciato maturare un pochino questo blog sperando che qualcuno desse un aiutino perche anche io ho lo stesso identico problema..... groupID = setpgid(0,getpid()); questa riga fallisce stampando :not owner nella console degli errori please sono in alto mare!!!! |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 255
|
ciao ho letto il post ma non ho capito niente
se mi spieghi in breve solo cosa vuoi fare ti aiuto io se riesco |
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 20
|
ciao xciaoatuttix!!!!
praticamente il programma sarebbe un agenzia viaggi che alla pressione di CTRL-Z va in sciopero per un tot di secondi (inseriti da tastiera) e poi continua a lavorare. questo implica che un programma invii a tutti i suoi figli un SIGSTOP e poi senza fare attesa attiva invii agli stessi processi un SIGCONT.... |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 255
|
allora questo programma funziona come dici:
lavora e quando riceve il segnale SIGTSTP ( Ctrl+z ) aspetta x secondi inseriti da tastiera. iniziamo da qui e poi vediamo che altro ti serve il discorso sui figli non l'ho capito. Quanti figli si devono creare ? vanno tutti sotto lo stesso gruppo ? anche il padre fa parte del gruppo? ecc Codice:
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
void sighandler(int);
main() {
signal(SIGTSTP,sighandler);
while(1){
printf("sto lavorando\n");
sleep(1);
}
}
void sighandler(int sig)
{int x;
printf("segnale ricevuto. Quanti secondi devo aspettare? \n");
scanf("%d",&x);
sleep(x);
}
Ultima modifica di xciaoatuttix : 08-09-2008 alle 16:58. |
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 20
|
il mio problema e che la sleep() effettua una attesa attiva...occupa la cpu invece dovrebbe sospendersi...e poi sarebbe troppo facile!!!
il processo padre e un demone che crea sei figli alla volta che nascono e muoiono in continuo...ad un certo punto (pressione di CTRL-Z) i figli si devono sospendere senza che pero venga sospeso il padre...se no non posso piu risvegliare niente... per quanto riguarda la gestione dei gruppi tutti i figli e il padre fanno parte dello stesso gruppo che ha come ID il pid del padre....comportamento di default perche come diceva FNF-fabius le setpgid() falliscono sempre e cmq altra piccola cosa.. se eseguo queste tre righe: sighold(SIGALRM); alarm(pausa); sigpause(SIGALRM); l'ultima istruzione mi termina il programma....percheee?!?!?!????? |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 255
|
non capisco perche ma anche a me fallisce mi spiace
pensavo bastasse avviare il programma come superuser e invece dice sempre che l'operazione non è permessa
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:13.



















