Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22

Discussione: [C] Mascherare segnali

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214

    [C] Mascherare segnali

    Ciao a tutti, ho una domanda teorica. Sto studiando un frammento di codice che si occupa di mascherare i segnali, in particolare SIGINT e SIGTERM. C'è però un punto che non capisco: utilizza lo stesso handler per entrambi i segnali, ma cambia la firma di questa funzione per i due casi, ovvero:
    codice:
    void gestore_int(int signum){
           //variabile globale
           global = 0; 
    }
    
    void gestore_term(int signum){
           //variabile globale
           global = 0; 
    }
    
    int gestore(){
    struct sigaction *x; 
    
    //maschera tutti i segnali. 
    //Installa i gestori per SIGINT E SIGTERM
    x->sa_handler = gestore_int; 
    sigaction(SIGTINT, x, NULL); 
    x->sa_handler = gestore_term;
    sigaction(SIGTERM, x, NULL); 
    
    //Rimozione della maschera. 
    }
    Essendo il codice di gestore_term e gestore_int identico, perchè non ha optato per utilizzare una funzione "comune" ad entrambi? Posto una bozza di quello che vorrei capire:

    codice:
    void gestore_generico(int sig){
          global = 0; 
    }
    
    int gestore(){
    ............ 
    x->sa_handler = gestore_generico; 
    sigaction(SIGTERM, x, NULL); 
    sigaction(SIGINT, x, NULL); 
    }
    Non dovrebbe essere identico a quanto scritto sopra?

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Tu e i puntatori non ne volete sapere di andare d'accordo...
    Avrai copiato male, come fa a esserci scritto:
    struct sigaction *x;
    e poche righe sotto
    x.sa_handler = ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Hai ragione, ma è scritta male la slide, io ho fatto solo copincolla! Correggo subito!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Così come la hai scritta ci vorrebbe una malloc, ma va bè ci rinuncio...
    Comunque non c'è problema perché l'implementazione di sigaction si salverà internamente x->sa_handler e a quel punto l'utente può anche fare quello che vuole della struttura, come riutilizzarla per una diversa chiamata a sigaction.

    P.S.: Il fatto che abbia usato due funzioni differenti credo sia solo per esplicitare meglio la cosa, o permettere una successiva modifica in modo più agevole.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Non sto parlando di un'implementazione eh, ho riportato solo una parte di codice che non mi è chiaro! Sto cercando di capire perchè il codice (non scritto da me, ma reperito in rete) utilizza due funzioni identiche, con una firma diversa, per gestire due segnali differenti ma gestiti allo stesso modo. Volevo sapere se c'era differenza tra una gestione "separata" e una globale.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Che io sappia non c'è differenza, tra un usare una sola callback o più callback... Quando hai scritto "utilizza lo stesso handler per entrambi i segnali" ho pensato erroneamente che chiamassi handler la struttura. In realtà invece di "utilizza lo stesso handler", la dicitura esatta era forse "utilizza due handler uguali". Ciao.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Ok hai risposto alla mia domanda. Già che ci sono ne pongo un'altra, senza aprire un ulteriore thread per il medesimo argomento:

    Se io ho un ciclo infinito che chiama la accept, un eventuale segnale interrompe questa funzione bloccante. Ma se il il processo non ha ancora completato tutte le sue funzioni, dunque dovrebbe effettuare altre chiamate alla accept, come può essere "rimandata" la gestione del segnale? Se ignorassi il segnale prima di accept, riattivandolo subito dopo non risolverei nulla, perchè gestirebbe al massimo 1 sola connessione avvenuta dopo l'arrivo del segnale. Ma non posso neppure ignorarlo per tutta la durata del blocco, perchè non uscirei mai dal ciclo.... In PSEUDOcode:

    codice:
    //Se ignorassi qui il segnale con signal(SIGNAL, SIG_IGN); non verrebbe mai riabilitato. 
    while(run){
        //Ignorandolo qui avrei al più una sola connessione dopo l'arrivo del segnale
         accept(); 
        //Riattivazione gestore per il segnale 
    }
    //signal(SIGNAL, gestore); mai eseguito...
    Per essere più chiari: supponiamo che debba chiamare 5 volte la accept, con un tempo di esecuzione pari a 10 secondi per terminare tutte le funzioni. Se il segnale arriva prima dei 10 secondi, perderei delle connessioni. Però il processo non può sapere a priori quante connessioni deve accettare... Quindi, come risolvere?

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Solo per curiosità, ma che tipo di software è, che quando è ora di fare shutdown ti devi preoccupare (e pure trattare sembra) delle connessioni ricevute negli ultimi 10 secondi?

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Un server avviato dopo i clienti, ad esempio.

    I clienti tentano una connessione su una socket non ancora creata. Quindi si sospendono e ci riprovano un tot di secondi dopo. Nel frattempo arriva il server, crea la socket e i clienti si connettono. Ma non tutti ci riescono, in quanto alcuni potrebbero essere ancora bloccati sulla loro "sleep" per ritentare la connessione. Potrebbero non comunicare mai: il server potrebbe essere sospeso prima ancora che loro si risveglino dalla "sleep", oppure il server viene sospeso prima di poter accettare la loro connessione.

    Si tratta di teoria ancora, sono quesiti che mi sono posto studiando in questo periodo..

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Continuo a non capire. Sembrava che il tuo problema fosse che quando il processo terminava la tua accept non funzionasse più. Volevi tenerla in vita ancora per un po'. Questo non capisco. Se il server sta chiudendo non è meglio che il prima possibile NON accetti più connessioni? Non capisco il senso di quel prolungamento di vita alla accept di 10 secondi...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.