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:
La funzione di sopra viene invocata nel client nel seguente modo: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 }
chiudiClient è la funzione che si occupa di chiudere il client in caso di ricezione di un segnale:codice:if(!impostaSegnali(chiudiClient)) { chiudiClient(); }
La stessa cosa avviene nel server...codice:void chiudiClient() { printf("\nCHIUSURA CLIENT\n"); exit(1); }
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ì:
gestioneTimeout:codice:signal(SIGALRM,gestioneTimeout); alarm(600);
Graziecodice:void gestione_timeout() { alarm(600); //"Ricarico il timer" <-- va fatto? printf("\nTempo scaduto, disconnessione..\n"); chiudiClient(); }

 
			
			 
					
					
					
						 Rispondi quotando
  Rispondi quotando