Domanda

Sto scrivendo un server molto semplice che gira per sempre fino a quando non viene premuto Ctrl-C. Vorrei che il gestore del segnale per ctrl-c chiudesse i socket aperti e spegnesse il server, ma non so quale sia lo scopo di un gestore del segnale e non mi piace l'idea di dichiarare il socket (s) Dovrei chiudere per essere globale.

Qualcuno può offrire suggerimenti? Esiste un modo standard per farlo?

È stato utile?

Soluzione

Bene, dato che hai gestori di segnali, suppongo che tu sia su una variante Unix. In tal caso:

  • Un socket è identificato nel kernel dal numero del file, che è un int. Vedi socket (2) .
  • Che int è valido per il tuo processo
  • Che int è valido per qualsiasi processo biforcuto dopo averlo creato
  • Se non close-on-exec, è valido per qualsiasi processo tu esegua.

Quindi, è perfettamente valido nel tuo gestore di segnale. Il modo in cui rendi il gestore del segnale consapevole del numero da utilizzare dipende dalla lingua in cui stai scrivendo, che non hai specificato. Esistono due approcci che funzioneranno praticamente in qualsiasi lingua

  • Se non hai alcuna pulizia da fare tranne chiudi ed esci, chiama exit. Oppure imposta l'azione del segnale sul valore predefinito, ovvero uscita. Il kernel chiuderà i socket.
  • Imposta un flag (che sarà generalmente un globale di qualche tipo) per dire al tuo ciclo di selezione / polling di ripulire ed uscire. Vantaggioso in quanto non devi preoccuparti se varie parti del tuo programma sono sicure da chiamare da un gestore di segnale.

Altri suggerimenti

Normalmente, è consigliabile non fare molto in un gestore di segnali; diverso da impostare una bandiera.

Quindi quando il controllo ritorna al tuo loop principale puoi esaminare questo flag, uscire dal loop, chiudere socket, lanciare distruttori sui tuoi oggetti ecc. ed uscire in modo pulito.

I gestori di segnali possono essere chiamati quasi in qualsiasi momento, anche durante le chiamate in libreria C o C ++, il che potrebbe essere un problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top