# \[C\] Communication entre processus

**URL:** <https://www.debian-fr.org/t/c-communication-entre-processus/24441>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 9:23 UTC](https://www.debian-fr.org/t/c-communication-entre-processus/24441 "2016-02-20T21:23:28Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Semprobe](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/dbc845/32.png) [@Semprobe](https://www.debian-fr.org/u/Semprobe)\
**Post date:** [Février 20, 2016, 9:23 UTC](https://www.debian-fr.org/t/c-communication-entre-processus/24441/1 "2016-02-20T21:23:28Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![gege2061](https://www.debian-fr.org/user_avatar/www.debian-fr.org/gege2061/32/3493_2.png) [@gege2061](https://www.debian-fr.org/u/gege2061)\
**Post date:** [Février 20, 2016, 9:23 UTC](https://www.debian-fr.org/t/c-communication-entre-processus/24441/2 "2016-02-20T21:23:31Z")

</div>

Bonjour,

> [@](#):
>
> J’avais d’abord pensé à un sytème de timeout mais je vois pas comment l’implémenter sans créer un nouveau processus…

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 😉

---

<div class="post-metadata">

**Author:** ![branch](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ee7513/32.png) [@branch](https://www.debian-fr.org/u/branch)\
**Post date:** [Février 20, 2016, 9:23 UTC](https://www.debian-fr.org/t/c-communication-entre-processus/24441/3 "2016-02-20T21:23:32Z")

</div>

Bonjour,

> [@](#):
>
> Un thread qui vérifie, à intervalle régulier, que le PID du fil (ou la boite aux lettres) est toujours présent

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.

---

<div class="post-metadata">

**Author:** ![BBT1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@BBT1](https://www.debian-fr.org/u/BBT1)\
**Post date:** [Février 20, 2016, 9:23 UTC](https://www.debian-fr.org/t/c-communication-entre-processus/24441/4 "2016-02-20T21:23:33Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![Semprobe](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/dbc845/32.png) [@Semprobe](https://www.debian-fr.org/u/Semprobe)\
**Post date:** [Février 20, 2016, 9:23 UTC](https://www.debian-fr.org/t/c-communication-entre-processus/24441/5 "2016-02-20T21:23:48Z")

</div>

Bonjour,

Avant tout, merci pour vos réponses.

> [@](#):
>
> 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).[/quote]
> 
> Est-ce possible de faire cela sans créer un nouveau processus ? Je croyais que thread et processus, c’était la même chose…
> 
> > [@](#):
> >
> > 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.
> 
> Ca ca me plait. Je vais faire quelques tests…
> 
> [quote=“BBT1”]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 ?.

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 ?

---

<div class="post-metadata">

**Author:** ![gege2061](https://www.debian-fr.org/user_avatar/www.debian-fr.org/gege2061/32/3493_2.png) [@gege2061](https://www.debian-fr.org/u/gege2061)\
**Post date:** [Février 20, 2016, 9:24 UTC](https://www.debian-fr.org/t/c-communication-entre-processus/24441/6 "2016-02-20T21:24:00Z")

</div>

> [@](#):
>
> Est-ce possible de faire cela sans créer un nouveau processus ? Je croyais que thread et processus, c’était la même chose…

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

> [@](#):
>
> Par quelle méthode ?

Effectivement, il n’existe pas de fonction pid\_exists ☹ Il existe bien une fonction Perl [Proc::Exists](http://search.cpan.org/~brianski/Proc-Exists-1.00/Exists.pm) ou au pire une analyse barbare de /proc. Par contre la proposition de BBT1 me semble plus simple et plus propre 😉

---

<div class="post-metadata">

**Author:** ![branch](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ee7513/32.png) [@branch](https://www.debian-fr.org/u/branch)\
**Post date:** [Février 20, 2016, 9:24 UTC](https://www.debian-fr.org/t/c-communication-entre-processus/24441/7 "2016-02-20T21:24:04Z")

</div>

[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](http://packages.debian.org/fr/lenny/procps) et [code source de psmisc](http://packages.debian.org/fr/source/lenny/psmisc).

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

---

<div class="post-metadata">

**Author:** ![BenJi](https://www.debian-fr.org/user_avatar/www.debian-fr.org/benji/32/3592_2.png) [@BenJi](https://www.debian-fr.org/u/BenJi)\
**Post date:** [Février 20, 2016, 9:33 UTC](https://www.debian-fr.org/t/c-communication-entre-processus/24441/8 "2016-02-20T21:33:25Z")

</div>

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.
