Buongiorno ragazzi. Nel progetto client/server che sto svolgendo devo gestire correttamente i segnali asincroni.
Premetto che il server gestisce le richieste di un client alla volta dato che nella listen ho impostato un BACKLOG
pari ad 1 (necessito di un chiarimento anche per questa cosa). Intanto le specifiche del progetto non specificano
quali segnali gestire, quindi sta tutto a me. Per ora ho pensato di gestire i seguenti segnali:
SIGINT
SIGQUIT
SIGILL
SIGSEGV
SIGTERM
SIGPIPE
SIGALRM
In particolare vorrei che il client terminasse la sua esecuzione alla ricezione di tutti questi segnali, e che il server facesse lo stesso tranne che per SIGPIPE. Ha logica secondo voi questo? Devo aggiungere altri segnali? Per la SIGALRM ho impostato una cosa del genere: quando il client si connette al server può occuparlo per 10 minuti, al termine dei quali il programma termina (in ogni caso, anche se sta svolgendo qualche operazione). Il tutto è gestito dentro il client. Sarebbe più carino se fosse il server a chiudere il client quando vede che questo è inattivo per un certo periodo di tempo ma non ho idea di come si faccia.
Questo è il codice, dove non ignoro SIGPIPE perchè non so come fare, vorrei modificarlo anche in quel senso:
Funzione che gestisce i segnali, è in un file separato:
codice:
#include "common.h"
int impostaSegnali(void (*handler)()){
//La sigaction è più nuova della signal
struct sigaction sa;
memset(&sa, '\0', sizeof(sigaction));
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if(sigaction(SIGINT, &sa, NULL) ||
sigaction(SIGQUIT, &sa, NULL) ||
sigaction(SIGILL, &sa, NULL) ||
sigaction(SIGSEGV, &sa, NULL) ||
sigaction(SIGTERM, &sa, NULL) ||
sigaction(SIGPIPE, &sa, NULL))
return 0; //fallimento
return 1; //successo
}
La funzione di sopra viene invocata nel client nel seguente modo:
codice:
if(!impostaSegnali(chiudiClient)) {
chiudiClient();
}
chiudiClient è la funzione che si occupa di chiudere il client in caso di ricezione di un segnale:
codice:
void chiudiClient() {
printf("\nCHIUSURA CLIENT\n");
exit(1);
}
La stessa cosa avviene nel server...
Grazie, spero possiate aiutarmi visto che ormai il progetto deve essere consegnato e il professore ci tiene alla gestione dei segnali ;-)
Edit:
Per la SIGALRM ho fatto così:
codice:
signal(SIGALRM,gestioneTimeout);
alarm(600);
gestioneTimeout:
codice:
void gestione_timeout() {
alarm(600); //"Ricarico il timer" <-- va fatto?
printf("\nTempo scaduto, disconnessione..\n");
chiudiClient();
}
Grazie