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:
Segnali: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;
run è una variabile di tipo volatile sig_atomic_t.codice:void signal (int sig){ run = 0; }
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!

Rispondi quotando