Ciao a tutti ragazzi, ho un problema in fase di chiusura del mio server. In pratica questi deve terminare "gentilmente" quando riceve un segnale di SIGINT o SIGTERM. Ho quindi realizzato una semplice funzione che, alla ricezione dei sopracitati segnali, dovrebbe terminare il server registrando qualche informazione su file e aggiornando qualche variabile.
Testando il server, ho notato che non si sospende mai, sebbene il "return" della funzione sia correttamente eseguito. Posto un po di pseudo-codice per farvi capire:
Server:
codice:
signal(SIGINT, signal);
signal(SIGTERM, signal);
//Inizializzazione, creazione socket => Tutto perfettamente testato e funzionante
//Ciclo di accettazioni connessioni da parte dei client
while(run){
//accetta eventuali connessioni pendenti dei client
if(accept() != -1){
//crea un thread per ogni connessione che gestisce le richieste
}
else continue; //passa alla successiva richiesta di connessione
}
//Scrive su file e termina
return EXIT_SUCCESS;
Segnali:
codice:
void signal (int sig){
run = 0;
}
run è una variabile di tipo volatile sig_atomic_t.
Server e client sono invocati mediante uno script, l'istruzione che determina il loop è la seguente:
killall -w server
L'unica spiegazione è che, avendo specificato di attendere la terminazione effettiva con l'opzione -w, il server non si chiuda, ma inserendo dei "printf" per verificare dove il codice si blocca, arriva senza errori al return.
Qualche idea? Grazie in anticipo!