[C] Communication entre processus

Bonjour,

2 processus s’exécutent simultanément.
Je cherche à faire en sorte que si l’un des processus meurt ou freeze (suite à un SIGKILL ou un SIGSTOP), l’autre puisse s’en rendre compte.

  1. Dans le cas où les processus sont père et fils
  2. Dans le cas où les processus sont indépendants, mais communiquent par boîte aux lettres, c’est-à-dire grâce à la bibliothèque <sys/msg.h>

J’avais d’abord pensé à un sytème de timeout mais je vois pas comment l’implémenter sans créer un nouveau processus… Bref, je suis preneur de tout conseil.

Merci d’avance.

Bonjour,

Un thread qui vérifie, à intervalle régulier, que le PID du fil (ou la boite aux lettres) est toujours présent (réciproquement, ne contient pas de dead letter).

Par contre attention, dans le second cas, comment compte tu envoyer le message ? L’utilisation de la fonction signal n’est pas possible.

Il me semble logique, que le premier message envoyé contienne le PID du processus “fils”, on se retrouve alors dans la même situation que pour le premier cas :wink:

Bonjour,

Par quelle méthode ?

Sinon pour détecter le freeze, envoyer un signal utilisateur au processus surveillé, qui a été programmé pour envoyer un accusé de réception à l’arrivée de ce signal. En calculant le temps de réponse, on doit pouvoir déterminer si quelque chose ne va pas.

Que penses-tu de rajouter un troisième processus
qui serait le père des deux autres
et de te reposer sur une des variantes de wait ?

Ce serait plus précis que du polling,
et ça ne consommerai quasiment aucune ressource
pendant l’exécution des 2 (ou plus) processus fils.

Bonjour,

Avant tout, merci pour vos réponses.

J’ai pour consigne d’éviter dans la mesure du possible de créer de nouveaux processus. De plus, si le processus “compteur” est tué par un kill -9, les autres continuent de s’exécuter sans le moindre contrôle, non ?

Au niveau du noyau Linux, peut-être, par contre au niveau du développeur, non.

Effectivement, il n’existe pas de fonction pid_exists :frowning: Il existe bien une fonction Perl Proc::Exists ou au pire une analyse barbare de /proc. Par contre la proposition de BBT1 me semble plus simple et plus propre :wink:

[quote=“gege2061”]une analyse barbare de /proc[/quote]Apparemment c’est comme ça que procède la commande “ps”. Je ne sais pas si c’est forcément sale. Pour avoir de l’inspiration : code source de procps et code source de psmisc.

[quote=“gege2061”]la proposition de BBT1 me semble plus simple et plus propre[/quote]+1

Tu peux “dérouter” certains signaux (pas SIGKILL…)

C’est à dire que lorsqu’un des deux process reçoit un signal, il va exécuter une fonction (que tu spécifira), puis réemettre le même signal sur lui (pour avoir le comportement attendu). Comme ça tu peux envoyer un autre signal bien spécifique (SIGUSR1 par ex) à l’autre process, comme ça le deuxième sait que le premier à été tué.

Si c’est pas clair je dois pouvoir trouver un bou de code qq part sur mon disque dur ^^

Pour la solution avec la bal, c’est le même principe : tu déroutes les signaux dans les process, quand un en reçoit bah il envoie un message à l’autre.