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:
SIGUSR1
il quitte avec un statut de sortie indiquant qu’un redémarrage est requirejs. Discussion:
SIGUSR1
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
.