C: Arrêtez l’exécution et passez à un point spécifique du programme lors de la réception d’un signal

J’ai écrit un code où deux programmes indépendants (disons 1 et 2) communiquent via des files d’attente de messages. Chaque programme envoie un message d’un type spécifique et attend la réponse d’un mtype spécifique. Basé sur les fonctions mtype sont invoqués. Le programme 2 attend initialement sur select() dans la queue des messages en attente du lancement de la chaîne de messages du programme 1 et après chaque chaîne de communication via les files d’attente de messages revient à select() attente de la prochaine chaîne de communication.

Je veux que le programme 2 retourne à select() en arrêtant l’exécution où qu’il se trouve entre une chaîne de communication lors de la réception d’un signal spécifique (par exemple SIGUUSR1 ) du programme 1 au cas où le programme 1 détecte une erreur entamerait une nouvelle chaîne de communication.

A la réception de ce signal, le programme 2 revient de toutes les fonctions en cours et des sauts droits pour select() .

Je regrette de ne pas partager un extrait de code, mais j’espère que j’ai bien compris.

Merci…

Que diriez-vous:

  • Lorsque le programme 2 démarre, il effectue la plupart de l’initialisation, puis effectue une copie de lui-même.
  • Le processus enfant crée le socket et s’y connecte, puis sélectionne et s’exécute normalement.
  • Lorsque le processus enfant reçoit SIGUSR1 il quitte avec un statut de sortie indiquant qu’un redémarrage est requirejs.
  • Le processus parent rest juste en attente de la sortie de l’enfant et si le statut de sortie indique qu’un redémarrage est requirejs, trame un autre enfant. (Tout autre état de sortie entraîne la sortie du parent avec le même statut).

Discussion:

  • Le redémarrage sera assez lent (besoin de créer des sockets, etc.).
  • Le processus 1 devra savoir que la queue des messages sera déconnectée lors de l’envoi de SIGUSR1
  • Cela devrait être très fiable et portable sur Posix.
  • Le bit de fork n’est en réalité qu’une optimisation. Vous pourriez faire en sorte que le processus parent soit une sorte de script – auquel cas le modèle pourrait même être porté sur Windows (le script serait évidemment différent, mais le source du programme 2 serait portable).

La seule autre alternative est d’avoir une sorte de drapeau qui traite 2 sondages “fréquemment”. Si l’indicateur est défini, le processus renvoie une exception (C ++) ou longjmp s (C) à l’appel select . Le drapeau est défini dans le gestionnaire de signaux.

Le problème avec cette approche est que a) elle se brise si quelque chose arrive pour vous empêcher de répondre b) il est assez difficile d’écrire du code qui est sûr d’exception ou qui ne fuit pas de ressources si vous le longjmp .