Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214

    [C] Server che non termina

    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!

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    La accept è bloccante per cui non ti basta settare run a zero, nella funzione in cui gestisci il segnale devi usare la exit.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Proprio in questo momento stavo pensando ad un'implementazione alternativa che mi permetta di aggirare l'accept bloccate. Utilizzando le istruzioni di jump, potrei restituire il controllo dopo il segnale all'istruzione successiva al ciclo. Ovvero:

    codice:
    if(setjmp(env) == 0){
    	while(run){ 
           }
    }
    else{
    chiusura del server. 
    }
    Segnali:
    codice:
    void signal(int sig){
    run = 0; 
    longjmp(env,1); 
    }
    In questo modo il server arriva comunque al return, ma non termina ugualmente il server.
    Dovendo usare la exit nel gestore dei segnali, dovrei utilizzare un'altra funzione che mi effettui la chiusura gentile, prima della chiamata exit, giusto? Intendo:
    codice:
    void signal(int sig){
    run = 0; 
    chiusuraGentile(); 
    exit(); 
    }

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Termina tutti i thread e poi fai la exit, se ci sono file aperti chiudili.Non si dovrebbero verificare problemi in questo modo.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Grazie, credo che il problema fosse proprio un file che rimaneva aperto.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.