Ciao a tutti,
ho un piccolo problemino che non capisco come mai si verifica.
nel main devo inserire un intero da 1 a 5 compresi, e per fare un controllo più "sofisticato", l'ho fatto così
do{
printf("\nScelta: ");
while(scanf("%d", &scelta)!=1){
while( getchar()!='\n'); //Pulisco il buffer
printf("\nAttenzione! Devi inserire un intero.\nRiprova: ");
}
while( getchar()!='\n'); //Pulisco il buffer
}while(scelta != 1 && scelta != 2 && scelta!= 3 && scelta != 4 && scelta != 5);
sempre dentro al main c'è
struct sigaction sa;
/* Segnale CTRL-C */
sa.sa_handler = signalHandler;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGINT, &sa, NULL) == -1) {
perror("sigaction");
return -1;
}
/* Segnale CTRL-Z */
sa.sa_handler = signalHandler;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGTSTP, &sa, NULL) == -1) {
perror("sigaction");
return -1;
}
per l'intercettazione dei segnali CTRL-C e CTRL-Z.
La funzione signalHandler è
void signalHandler(int signal){
printf("\nHo intercettato il signal handler CTRL-C o CTRL-Z\n\n");
scelta = 5;
}
dove scelta è una variabile dichiarata volatile. scelta=5 fa entrare in un case che si occupa di disconnettere il client dal server.
Il problema è che, con il controllo sull'imput che ho fatto, se nel terminale premo CTRL-C o CTRL-Z mi stampa a schermo la print "Ho intercettato..." ma non fa niente (non disconnette).
Se invece il controllo iniziale lo sostituisco con questo, più semplice che controlla solo se inserisco numeri che si aspetta, ma va in palla se inserisco lettere
if(scelta < 1 || scelta > 5){
do{
printf("\nScelta: ");
scanf("%d", &scelta);
}while(scelta != 1 && scelta != 2 && scelta!= 3 && scelta != 4 && scelta != 5);
}
l'intercettazione dei segnali CTRL-C o CTRL-Z funzionano