Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1301 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [C++] Communication entre 2 programmes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Communication entre 2 programmes

n°667958
quickman
Posté le 25-04-2005 à 15:21:11  profilanswer
 

Bonjour,  
 
je suis en train de codé un ensemble de programme déstiné à être intégré dans un robot ( PC Embarqué sous Linux ) et j'ai préféré séparé la fonction global en plusieurs sous systèmes pour une plus grande facilité de débuggage et je l'espère une plus grande stabilité de l'ensemble ( je compte réaliser un petit prog qui surveille l'execution et relance le prog en cas de plantage :/ )
 
Seulement voila, il est venu le temps de faire 'communiquer' les programmes entre eux, il y a une sorte d'architecture client/serveur avec 2 programmes qui jouent le rôle de serveur, et 1 prog qui récupère tous ca.
 
J'ai déja lu quelques trucs sur les IPC & co mais ils s'agient le plus souvent de communication entre thread, avec des processus parents & fils. Mais dans mon cas ils s'agient de processus au lancement completement séparé, mais qui doivent se synchroniser.
 
Donc pour cela j'avais pensser faire comme cela, dites moi ce que vous en penssez :/
 
Le serveur ouvre un 'partage' IPC au démarrage et met la clef dans un fichier au nom constant.
Le client ouvre le fichier, recupère le clef, et ouvre  le partage avec cette clef, ensuite il lui suffit d'utiliser les données quand il en a besoin.
 
Les problèmes qui pourrait survenir sont tout d'abord des problèmes d'accès, je ne sais pas ce qu'il adviendrait si cela arrivé ( visiblement il existe pour cela les MUTEX mais je n'ai pas très bien compris, je pensse que je vais chercher un peu de doc la dessus ), et d'autre part, il n'y aurait pas plus simple? Je me suis dis intuitivement que pour communiquer entre eux les progs avez besoin d'un point fixe ( le fichier ), mais je ne sais pas si c'est exact et s'il n'y a pas d'alternative plus simple voir plus sure a mettre en oeuvre.
 
Qu'en penssez vous ( et désolé pour le pavé :'( )


Message édité par quickman le 25-04-2005 à 15:35:57
mood
Publicité
Posté le 25-04-2005 à 15:21:11  profilanswer
 

n°667965
cycojesus
Mèo Lười
Posté le 25-04-2005 à 15:32:31  profilanswer
 

La troisième porte à gauche après la cuisine, la lumière est sur la droite à l'intérieur.
http://forum.hardware.fr/hardwaref [...] _sujet.htm


---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/
n°667966
quickman
Posté le 25-04-2005 à 15:35:23  profilanswer
 

cycojesus a écrit :

La troisième porte à gauche après la cuisine, la lumière est sur la droite à l'intérieur.
http://forum.hardware.fr/hardwaref [...] _sujet.htm


 
je me disais que vu qu'il s'agit d'échange interprocessus sous Linux, ca avait surement ca place ici plus que sur prog, mais bon, je me suis ptet tromper ...

n°667970
kzimir
-
Posté le 25-04-2005 à 15:51:07  profilanswer
 

J'ai travaillé 3 mois sur un robot sous Linux avec une architecture similaire :) Je n'ai pas le temps de détailler cet après-midi (je le ferai ce soir si tu le souhaites), mais j'ai fait exactement ce que tu suggères (avec des sémaphores et du partage de mémoire en IPC), et ça marche très très bien. Je ne sais pas si j'ai le droit de te donner mes classes par contre :/
 
Edit : à la seule différence que la clef était en dur dans le code. C'est une constante pour que la communication se fasse bien, donc je ne vois pas pourquoi l'exporter...


Message édité par kzimir le 25-04-2005 à 15:56:08
n°667978
quickman
Posté le 25-04-2005 à 16:02:16  profilanswer
 

kzimir a écrit :

J'ai travaillé 3 mois sur un robot sous Linux avec une architecture similaire :) Je n'ai pas le temps de détailler cet après-midi (je le ferai ce soir si tu le souhaites), mais j'ai fait exactement ce que tu suggères (avec des sémaphores et du partage de mémoire en IPC), et ça marche très très bien. Je ne sais pas si j'ai le droit de te donner mes classes par contre :/
 
Edit : à la seule différence que la clef était en dur dans le code. C'est une constante pour que la communication se fasse bien, donc je ne vois pas pourquoi l'exporter...


 
 
dans le cours que j'avais la clef était une variable sans l'attribue 'const', donc je l'ai supposée dynamique, mais si l'on peu faire sans, c'est tout aussi bien et ca me permet de virer un accès a un fichier inutile  [:bigsmilev]  
 
Un peu moins de code, un peu moins de boggue ... [:bbcmoi]
 
PS: si tu peux m'expliquer simplement comment tu as fait, sans nécessairement me donnée le code ( je suis pas un adepte du tout fait, mais je suis dans une position délicate :p le code doit être près pour dans 1 semaine, ... mais y a pas que ca[/mylife] ), donc si tu as le temps de m'expliquer, ce serait super [:bidinoo]


Message édité par quickman le 25-04-2005 à 16:04:52
n°667980
kzimir
-
Posté le 25-04-2005 à 16:11:38  profilanswer
 

quickman a écrit :

dans le cours que j'avais la clef était une variable sans l'attribue 'const', donc je l'ai supposée dynamique, mais si l'on peu faire sans, c'est tout aussi bien et ca me permet de virer un accès a un fichier inutile  [:bigsmilev]  
 
Un peu moins de code, un peu moins de boggue ... [:bbcmoi]
 
PS: si tu peux m'expliquer simplement comment tu as fait, sans nécessairement me donnée le code ( je suis pas un adepte du tout fait, mais je suis dans une position délicate :p le code doit être près pour dans 1 semaine, ... mais y a pas que ca[/mylife] ), donc si tu as le temps de m'expliquer, ce serait super [:bidinoo]


 
OK, je t'explique ça ce soir, sauf imprévu.

n°667988
_darkalt3_
Proctopathe
Posté le 25-04-2005 à 16:38:56  profilanswer
 

Corba peut t'aider.
[:drapal]


Message édité par _darkalt3_ le 25-04-2005 à 21:54:31

---------------
Töp of the plöp
n°668047
Jar Jar
Intaigriste
Posté le 25-04-2005 à 19:26:47  profilanswer
 

Là comme ça pour un truc simple j'utiliserais une FIFO placée sur le disque à un endroit idoine (mkfifo est ton ami). Plus sophistiqué, il y a D-BUS, qui est conçu pour la communication entre daemons. Et le must c'est CORBA, mais là c'est plus pour faire des RPC, ce qui me paraît carrément le grand luxe pour ce que tu cherches à faire.

n°668060
kzimir
-
Posté le 25-04-2005 à 19:43:24  profilanswer
 

Bon, au boulot :D
 
Supposons que l'on veuille partager une donnée toto de type Toto : on va pointer dessus, le pointeur donnant sur la zone partagée. Toto ne dois pas être un pointeur, ni un attribut virtuel (impossibles à partager).
 
Définissons une clef pour la mémoire et une pour le sémaphore (ça peut être la même). On stocke les id des ressources partagées dans idMem et idSema.
 

Code :
  1. #include <sys/types.h>
  2. #include <sys/ipc.h>
  3. #include <sys/shm.h>
  4. #include <sys/sem.h>
  5. const int CLEF_MEM=12345;
  6. const int CLEF_SEMA=6789;
  7. int idMem;
  8. int idSema;
  9. Toto * toto;


 
Pour pouvoir pointer sur la mémoire, il faut qu'elle soit créée. Le premier processus lancé doit la créer (flag IPC_CREAT), le second n'a pas ce flag.
 

Code :
  1. idMem=shmget(CLE_MEM, sizeof(Toto), 0666|IPC_CREAT); // Sans IPC_CREAT pour le processus qui ne crée pas les ressources
  2. toto=(Toto *)shmat(idMem, NULL, 0);


 
Pour libérer la mémoire partagée (par le dernier processus qui finit) :
 

Code :
  1. shmctl(idMem, IPC_RMID, NULL);


 
Voilà pour la mémoire, y a plus qu'à manipuler toto. Par contre, pour éviter les accès concurrents à la mémoire, il faut ajouter des sémaphores d'exclusion mutuelle.
 
Définissons les opérateurs de verrouillage et libération de l'accès mémoire :
 

Code :
  1. struct sembuf operP;
  2. struct sembuf operV;


 
On initialise les opérateurs :
 

Code :
  1. operP.sem_num=0;
  2. operP.sem_op=-1;
  3. operV.sem_num=0;
  4. operV.sem_op=1;


 
On initialise les sémaphores (IPC_CREAT mis ou pas, comme précédemment) :
 

Code :
  1. idSema=semget(CLEF_SEMA, 1, 0777|IPC_CREAT);
  2. // La suite pour celui qui crée les ressources : initialise le sémaphore à 1
  3. ushort tabInit[]={1}; // Si jamais on met plus d'un sémaphore dans le jeu...
  4. semctl(idSema, 1, SETALL, tabInit);


 
Pour se réserver l'accès mémoire :
 

Code :
  1. semop(idSema, &operP, 1);


 
Pour le libérer après avoir fait ce qu'on veut avec la ressource :
 

Code :
  1. semop(idSema, &operV, 1);


 
Enfin le dernier processus à terminer doit détruire le sémaphore :
 

Code :
  1. semctl(idSema, 0, IPC_RMID);


 
Voilà, l'essentiel est là je crois, y a plus qu'à mettre ça comme tu le sens dans une classe (genre les initialisations dans le constructeur et des méthodes pour bloquer/débloquer les sémaphores etc.)

n°668122
quickman
Posté le 25-04-2005 à 21:58:16  profilanswer
 

:D merci :jap: je suis certain que ca en aidera plus d'un :p

mood
Publicité
Posté le 25-04-2005 à 21:58:16  profilanswer
 

n°668323
quickman
Posté le 26-04-2005 à 12:46:41  profilanswer
 

question con: si mais programmes en 'client/serveur', que le serveur est en écriture seule & que le client est lui en lecture seule, ai-je besoin de sémaphore pour réserver l'accès?

n°668432
_darkalt3_
Proctopathe
Posté le 26-04-2005 à 15:08:07  profilanswer
 

Jar Jar a écrit :

Et le must c'est CORBA, mais là c'est plus pour faire des RPC, ce qui me paraît carrément le grand luxe pour ce que tu cherches à faire.


 
Certes.


---------------
Töp of the plöp
n°668528
kzimir
-
Posté le 26-04-2005 à 17:46:29  profilanswer
 

quickman a écrit :

question con: si mais programmes en 'client/serveur', que le serveur est en écriture seule & que le client est lui en lecture seule, ai-je besoin de sémaphore pour réserver l'accès?


 
Oui, les écritures et lectures ne sont certainement pas des opérations élémentaires.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [C++] Communication entre 2 programmes

 

Sujets relatifs
Problème de communication en 100Mbits incompréhensible...programmes: de windows à linux
Interagir avec des programmes avec Apache ?Les bons petits programmes récents pas connus !
juste pour faire connaitre deux programmes multimedia séduisantslocalisation des programmes installes [resolu par 900cbr555]
[INITTAB] comment faire pour lancer des programmes au boot?Probleme de communication entre linux et XP
Programmes non désirés !!Linux + compatibilité Programmes ?
Plus de sujets relatifs à : [C++] Communication entre 2 programmes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR