Question

J'écris un serveur très simple qui boucle en boucle jusqu'à ce que l'on appuie sur Ctrl-C. J'aimerais que le gestionnaire de signaux de ctrl-c ferme les sockets ouverts et arrête le serveur, mais je ne sais pas quelle est la portée d'un gestionnaire de signaux et je n'aime pas l'idée de déclarer le socket. (s) Il faudrait que je ferme pour être global.

Quelqu'un peut-il proposer des suggestions? Existe-t-il un moyen standard de le faire?

Était-ce utile?

La solution

Eh bien, puisque vous avez des gestionnaires de signaux, je vais supposer que vous êtes sur une variante Unix. Si oui:

  • Une socket est identifiée au noyau par son numéro de fichier, qui est un int. Voir socket (2) .
  • Cet int est valide pour votre processus
  • Cet int est valide pour tout processus créé après sa création
  • Si ce n'est pas close-on-exec, il est valide pour tous les processus que vous exécutez.

Donc, il est parfaitement valide dans votre gestionnaire de signal. La manière dont vous indiquez à votre gestionnaire de signal quel numéro utiliser dépend de la langue que vous écrivez, que vous n'avez pas spécifiée. Il existe deux approches qui fonctionnent dans pratiquement toutes les langues

  • Si vous n'avez aucun nettoyage à faire à part fermer et quitter, appelez simplement exit. Ou définissez l'action du signal sur default, ce qui correspond à exit. Le noyau fermera les sockets.
  • Définissez un indicateur (généralement global) pour indiquer à votre boucle sélection / interrogation de nettoyer et de quitter. L’avantage est que vous n’aurez pas à vous inquiéter si diverses parties de votre programme peuvent être appelées en toute sécurité par un gestionnaire de signaux.

Autres conseils

Normalement, il est conseillé de ne pas faire grand chose dans un gestionnaire de signal; autre que de définir un drapeau.

Ensuite, lorsque le contrôle revient sur votre boucle principale, vous pouvez examiner cet indicateur, quitter la boucle, fermer les sockets, exécuter des destructeurs sur vos objets, etc., et quitter proprement.

Les gestionnaires de signaux peuvent être appelés à tout moment, y compris au milieu des appels de bibliothèque C ou C ++, ce qui peut poser problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top