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