Salve a tutti! Devo scrivere un programma in C che crei 4 processi figli. Ogni processo figlio ha una variabile contatore "cnt" che viene incrementata ogni volta che il processo riceve il segnale SIGUSR1. Ogni processo figlio, ogni secondo, valuta l'espressione "cnt > 10" e, se il risultato è TRUE, termina.
Il processo padre, una volta creati i figli, deve inviare ripetutamente il segnale SIGUSR1 ad un figlio scelto a caso (conservo i pid dei figli in un array e genero l'indice tra 0 e 3 randomicamente).Quando tutti i figli terminano l'esecuzione, termina anche il padre.
Ho il seguente codice che mi è stato fornito dal prof, ma che non funziona. Quando i processi figli ricevono il segnale SIGUSR1 viene chiamata la funzione handler che aumenta il contatore. Quando il padre invia il segnale SIGCHLD, viene chiamata la funzione exit_handler. Il problema è che, in esecuzione, dopo aver creato i 4 processi, viene terminato un processo figlio, chiamata 4 volte la funzione handler e poi basta. Continua così senza terminare mai. Ho verificato che la kill viene chiamata e non capisco, quindi, perchè i processi non vengono terminati.
Voglio precisare che mi sto approcciando da pochi giorni ai processi e a questo tipo di programmazione (per un esame universitario), quindi è possibile che abbia detto stupidaggini. Non siate troppo severi. Qualcuno sa dirmi dove ho sbagliato?
codice:#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/types.h> #include <sys/wait.h> #define NUM_PROC 4 int cnt = 0; int term = 0; void handler(int signum){ cnt++; } void exit_handler(int signum){ int status; wait(&status); term++; printf("GENITORE: status del processo figlio = %d. Processi terminati: %d.\n", WEXITSTATUS(status), term); } int main(void) { pid_t pid[NUM_PROC]; pid_t mypid; int i; for(i=0; i<NUM_PROC; i++){ if((mypid = fork()) == 0){ // Figlio signal(SIGUSR1, handler); while(1){ sleep(1); // Ogni secondo.. if(cnt > 10){ // ..verifica l'espressione.. // ..se è vera stampa un messaggio di terminazione.. printf("FIGLIO (pid %d): %d, termino.\n", getpid(), i+1); return(i+1); } printf("FIGLIO (pid %d): %d, termino.\n", getpid(), i+1); return(i+1); } }else{ // Padre printf("GENITORE (pid %d): Ho generato il figlio con pid %d.\n", getpid(), mypid); pid[i] = mypid; } } signal(SIGCHLD, exit_handler); while(term < 4){ int k = rand() % 4; usleep(50000); int check = kill(pid[k], SIGUSR1); if(check == 0){ printf("Ucciso il processo figlio %d con successo.", pid[k]); } } }



					
					
					
						
  Rispondi quotando