Buongiorno a tutti,
vi illustro il testo dell'esercizio che dovrei dare:
"Esercizio 4 (signal handler):
Scrivere un programma C che:
Crea un figlio;
Intercetta tramite handler apposito i segnali SIGUSR1, SIGUSR2; quando riceve il segnale x, visualizza
“Ricevuto il segnale x”;
Riceve in input su riga di comando una sequenza di interi x1,x2,...xk.
In un ciclo infinito ad intervalli regolari, invia al processo figlio uno dei segnali ricevuti in input.
Il processo figlio:
Intercetta I segnali SIGUSR1, SIGUSR2 e SIGINT;
Blocca tutti I segnali eccetto SIGUSR1, SIGUSR2 e SIGINT;
Quando riceve SIGUSR1 invia al padre SIGUSR2;
Quando riceve SIGUSR2 invia al padre SIGUSR1;
Quando riceve SIGINT invia al padre SIGINT."
Ora quello che ho fatto io:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void signal_manager_father(int signal){
switch(signal){
case SIGUSR1:
printf("Ricevuto il segnale SIGUSR1\n");
break;
case SIGUSR2:
printf("Ricevuto il segnale SIGUSR2\n");
break;
}
}
void signal_manager_child(int signal){
switch(signal){
case SIGUSR1:
kill(getppid(),SIGUSR2);
break;
case SIGUSR2:
kill(getppid(),SIGUSR1);
break;
case SIGINT:
kill(getppid(),SIGINT);
exit(1);
}
}
int main(int argc,char **argv){
int pid,i;
if((pid=fork())){//Padre
signal(SIGUSR1,signal_manager_father);
signal(SIGUSR2,signal_manager_father);
for(i=1;1;i=i%(argc-1)+1){
kill(pid,atoi(argv[i]));
sleep(2);
sleep(2);
}
}
else{//Figlio
signal(SIGUSR1,signal_manager_child);
signal(SIGUSR2,signal_manager_child);
signal(SIGINT,signal_manager_child);
for(i=0;i<32;i++)
if(i!=SIGUSR1&&i!=SIGUSR2&&i!=SIGINT)
signal(i,SIG_IGN);
while(1)
pause();
}
return 0;
}
Il problema è che non riesco a capire perchè non funzioni, se qualcuno di voi può aiutarmi ve ne sarei molto grato