Salve a tutti.
Ho il seguente problema:
Sto sviluppando un'applicazione client/server in C sotto linux.
Il client si collega al server e gli comunica un nick. Il server ricevuto il nick, provvede ad accodare il client in una CODA di client incrementando una variabile globale che rappresenta il numero di connessioni attuali. Fin qui non ci piove. (Ovviamente queste due operazioni sono atomiche, e quindi ho utilizzato un semaforo).
Quando invece un client si disconnette, sempre atomicamente, il server provvede ad eliminare il client dalla coda e decrementare il numero di connessioni attuali.
Il problema nasce nel momento in cui il client sta effettuando una qualsiasi operazione che viene gestita dal thread accettazione, perchè nel momento in cui il client si trova a dover interagire con il thread, e viene generata una interruzione (CTRL+C), il client non cattura il segnale, e quindi non elimina l'utente dalla coda, e non decrementa il numero di connessioni al server. Cioè è come se ignorasse completamente il CTRL+C, però nel frattempo il client si disconnette, cioè termina la sua esecuzione.
Vi posto un pò di codice, può essere che si capisca dov'è il problema.
Ora nel client ho il seguente codice:
codice:
....
signal(SIGINT, client_int);
...
void client_int(int signum)
{
//Handler per l'interruzione del client
// Manda il messaggio "int" al server
write_socket( sock_fd, "int");
// Chiude il socket
close(sock_fd);
exit(1);
}
Se il thread non viene creato e faccio CTRL+C dal client, tutto funziona.
Se il thread viene creato e utilizzo il menu per uscire, chiamando la funzione client_int, tutto funziona
Ma se il thread viene creato e faccio CTRL+C dal client, il client si disconnette, ma non viene gestito il segnale. (Perchè???)
Nel server ho un thread con il seguente codice:
codice:
void *accettazione(void *conn_fd)
{
char buffer[1024];
int fd = (int)conn_fd;
while(1)
{
read_socket(fd, buffer);
if(strcmp(buffer,"new")==0)
{
//Crea una nuova partita
}
...
// Ci sono altri else if, per altri messaggi di scambio con il client
....
else if(strcmp(buffer,"int")==0)
{
pthread_mutex_lock(&m_coda);
eliminaNodo(&coda, fd);
nConnessioni--;
pthread_mutex_unlock(&m_coda);
}
}
}
Spero di essermi spiegato... Aiutatemi voi!