Communication interprocessus [Résolu]

Messages postés
117
Date d'inscription
vendredi 10 février 2006
Dernière intervention
30 mars 2012
- - Dernière réponse : infodaoudi
Messages postés
117
Date d'inscription
vendredi 10 février 2006
Dernière intervention
30 mars 2012
- 27 mars 2012 à 16:43
Bonjour,
j'ai un programme (et non pas une fonction) qui doit retourner plusieurs paramètres (15 de types différent) , ces paramètres devront être communiquer à un autre programme (et non pas une fonction). les deux programmes sont écrits en c++.
Une première solution consiste à écrire les paramètres de sortie du premier programme dans un fichier qui seront lu par le deuxième. Cette solution n'est malheureusement pas adaptée à mon application. Je souhaite que le premier programme renvoie une classe dans laquelle je stocke mes paramètres qui seront éventuellement lu par le deuxième programme.
Mes questions:
1.une fonction main() peut renvoyer une classe? si oui comment?
2. Y-il d'autres solutions de communiquer ces paramètres sans passer par des fichiers.

Merci pour toute proposition.
Afficher la suite 

Votre réponse

20/24 réponses

Meilleure réponse
Messages postés
3831
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
30 janvier 2019
162
3
Merci
Techniquement, tu dois avoir les choses suivantes:
- Un indexer qui travaille pendant 3 jours à la création de tes fichiers (Ça tu as déjà).
- Un serveur qui charge les fichiers, et retient les informations en mémoire. Quand on l'interroge, il répond (il sera interrogé par ton interface en php). Il te faut modifier ton "searcher" actuel pour qu'il ait ce comportement.
- Un deuxième serveur, identique au premier, mais sur un port différent.

Si ton interface, s'aperçoit que le premier serveur n'est pas disponible, elle doit interroger le second.

Pour mettre à jour, après une indexation, il te faut couper le premier serveur et le mettre à jour. Une fois fait, tu coupes le deuxième serveur et tu le mets à jour. Ainsi, tu as toujours un serveur de disponible pour faire ta recherche.

Pour les serveurs, tu peux dialoguer via webservices, c'est ce qu'il y a de plus simple pour un script php pour dialoguer avec un serveur en C++ (tu peux aussi faire du rpc, mais c'est plus chiant à gérer).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3831
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
30 janvier 2019
162
0
Merci
Bonjour.

1.une fonction main() peut renvoyer une classe? si oui comment?

Absolument pas ! Un programme retourne un entier, qui correspond à un numéro d'erreur. Impossible de renvoyer autre chose.

2. Y-il d'autres solutions de communiquer ces paramètres sans passer par des fichiers.

Oui :)
Je ne sais pas si tu es sous Windows, ou Linux, mais voici quelques solutions:
- Fichier texte.
- Fichier contenant une classe, un tableau ou ce que tu veux. Le tout étant sérialisé (voir Google Protobuf ou Boost::serialization).
- Par socket (pratique surtout si les programmes ne sont pas sur les mêmes machines).
- Par fichier socket (si tu es sous Linux).
- Par tube nommé.
- Avec de la mémoire partagée.

Si tu peux me décrire quelles sont les contraintes que tu as et ce que tu cherches à réaliser, je pourrais peut être t'aiguiller sur l'une de ces méthodes.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
117
Date d'inscription
vendredi 10 février 2006
Dernière intervention
30 mars 2012
0
Merci
Merci pour ta réponse:
au fait, je suis sous Windows, les paramètres je veux les garder en mémoire pour éviter les E/S (lecture écriture dans des fichiers) , je développe un moteur de recherche qui devrait être rapide en temps de calcul et les E/S ont un coût énorme (notamment si les données sont volumineuse).
Voilà en gros j'ai deux programmes différents et il doivent communiquer des données entre eux (le premier programme doit communiquer des données volumineuses au deuxième) , y-a-il une solution optimal en temps de calcul? (je souhaite éviter les fichiers car ils consomment beaucoup en temps de calcul)
Merci beaucoup:)
Commenter la réponse de infodaoudi
Messages postés
3831
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
30 janvier 2019
162
0
Merci
Ok je cerne mieux ta problématique, mais tu ne m'as pas encore donné assez de détails pour que je puisse t'aider.

On va déjà éliminer les solutions à base d'accès disque. Ne reste alors que deux méthodes: mémoire partagée ou dialogue réseau (en local ou à distance) via peut être du rpc.

Quels sont les intéractions entre ces deux programmes ? Est-ce qu'ils sont forcément "allumés" en même temps ? Que se passe-t-il si l'un d'eux ne l'est pas ? Est-ce que l'un des programmes est un client de l'autre ou les deux sont ils plutôts de type associés ?

J'ai vraiment besoin de bien connaître les liens qui lient ces deux programmes pour te conseiller au mieux.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
3831
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
30 janvier 2019
162
0
Merci
(J'ai renommé le sujet parce qu'il n'était pas explicite. De "Main()" => "Communication interprocessus").

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
117
Date d'inscription
vendredi 10 février 2006
Dernière intervention
30 mars 2012
0
Merci
Merci bcp pour ton aide,
au fait c'est trop simple:
1) j'ai une interface graphique en php qui fait appel à un premier programme (indexation) codé en VC++, ce programme réalise un certain nombre de traitement et inscrit les résultat dans des fichiers textes
2)à travers l'interface graphique je fait appel au programme 2 (recherche)codé en VC++ qui a comme paramètres d'entrées les résultats de l'exécution du programme indexation
le programme recherche doit être optimal d'un point de vu temps de calcul, la lecture des paramètres à travers les fichiers texte me consomme bcp de temps.

C'est clair maintenant??:)
Commenter la réponse de infodaoudi
Messages postés
3831
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
30 janvier 2019
162
0
Merci
Suite à tes réponses, j'ai de nouvelles questions :)

- Pourquoi deux programmes ? Pourquoi est-ce que tu n'aurais pas un seul programme qui fait l'indexation et la recherche ? Ainsi, le problème ne se poserais même pas.
- Si tu as besoin d'un moteur de recherche, pourquoi ne pas directement utiliser des solutions existantes sur le marché ? (Lucene, solr, MongoDB ?).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
117
Date d'inscription
vendredi 10 février 2006
Dernière intervention
30 mars 2012
0
Merci
oui avec plaisir:)
au fait, disant que mon application est destinée à indexer plusieurs bases de données pour ensuite faire des recherches par le contenu. Donc j'ai déjà un programme qui fait tout et je souhaite séparer la recherche et l' indexation pour répondre à d'autres objectifs .
concernant ta deuxième remarque, oui je sais qu'il y a des solutions dans le marché mais là c'est un travail de recherche que je souhaite développer qui me tient personnellement à cœur!
voilà
Commenter la réponse de infodaoudi
Messages postés
3831
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
30 janvier 2019
162
0
Merci
Ok, si j'ai bien compris, tu cherches à réaliser ta propre solution dans un but pédagogique.
Celle-ci doit être composé de deux programmes ayant chacun leurs rôles.

Néanmoins, si les deux programmes sont si liés, pourquoi les scinder ? Quelle contrainte t'oblige à avoir deux programmes ?

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
109
Date d'inscription
samedi 3 novembre 2007
Dernière intervention
4 février 2016
Commenter la réponse de cs_aymen87
Messages postés
3831
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
30 janvier 2019
162
0
Merci
@aymen87: Avant de faire ça, mieux vaut se poser les bonnes questions... Il faut, certes, donner des réponses techniquement justes, mais aussi et surtout conceptuellement justes. Ici, la question de savoir s'il pourrait n'avoir qu'un seul exécutable est primordiale.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
36
0
Merci
Je plussoie la remarque de CptPingu, si j'avais prog2 qui doit absolument attendre les résultats de prog1, je mettrais le tout dans prog1.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
117
Date d'inscription
vendredi 10 février 2006
Dernière intervention
30 mars 2012
0
Merci
Bonjour,
merci pour cette proposition c'est exactement ce que je cherche, je ne savais pas que ça existe. Je vais lancer une recherche pour voir si c'est facile à implémenter...
Commenter la réponse de infodaoudi
Messages postés
117
Date d'inscription
vendredi 10 février 2006
Dernière intervention
30 mars 2012
0
Merci
Bonjour,
pour répondre vos questions CptPingu et BruNews. Effectivement j'ai des contraintes sur ce programme est une des contrainte c'est d'avoir deux exécutables différents qui communiquent à travers une interface graphique que je dois mettre sur le web , et le deuxième exécutable attend les résultats du premier.
Commenter la réponse de infodaoudi
Messages postés
3831
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
30 janvier 2019
162
0
Merci
On a bien compris que tu dois avoir une interface graphique qui dialogue avec un exécutable. Mais pourquoi l'interface doit elle dialoguer avec deux binaires ? Un seul suffit.
Conceptuellement, si tes deux programmes sont si interdépendants, il y a de forte chance qu’architecturalement, ça devrait être un seul et unique binaire. Ma question c'est: pourquoi avoir deux binaires qui communiquent entre eux ? Quelle est précisément la contrainte qui te force à avoir deux binaires ? Pour l'instant, je ne vois aucune raison qui t'oblige à avoir deux binaires, surtout que tu parles de performances, et avoir deux binaires communicants ensemble sera *toujours* plus lent que d'avoir un seul binaire...

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
117
Date d'inscription
vendredi 10 février 2006
Dernière intervention
30 mars 2012
0
Merci
au fait, sur le plan pédagogique les deux programmes correspondent à deux étapes différentes (l'indexation (prog1 et la recherche(prog2)) l'indexation s'effectue hors ligne elle peut prendre 3 jours de calcul et la recherche est on ligne elle doit prendre quelque secondes voir quelques millisecondes(le temps de calcul doit être optimal). La recherche s'effectue sur la base des indexes calculés par le programme1 ces index servent d'entrée pour le deuxième programme (la recherche)...voilà:)
Commenter la réponse de infodaoudi
Messages postés
3831
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
30 janvier 2019
162
0
Merci
l'indexation s'effectue hors ligne elle peut prendre 3 jours de calcul et la recherche est on ligne elle doit prendre quelque secondes voir quelques millisecondes

Rien n'empêche d'avoir un seul binaire, multi-threadé (il peut faire l'indexation et la recherche). Ça sera mieux que de faire du partage mémoire.
Néanmoins, je te déconseille de faire un seul binaire et je te déconseille même de faire du partage mémoire !

Je m'explique. Ton processus qui dure 3 jours, doit écrire ses résultats quelque part. Si tu fais de la mémoire partagée ou un seul binaire, ça implique que ton programme ne doit jamais s'éteindre tant qu'on a besoin de lui (pour indexer puis pour être interrogé). Or, il suffit que la machine est un souci, que le binaire plante ou tout autre problème, et tu perds 3 jours de calcul !
Beaucoup trop risqué...

La solution est simple, ton programme d'indexation ne doit pas changer. Il doit toujours écrire ses résultats quelque part (pourquoi pas dans des fichiers, après tout). Mais ton indexer, lui, ne doit pas fouiller les fichiers ! Sinon c'est clair que c'est trop lent. Il doit charger l'intégralité des fichiers en RAM au démarrage, puis lorsqu'on l'interroge, il répond en se basant sur les informations qu'il aura chargé. Le démarrage sera lent, mais l'interrogation sera très rapide. Et je pense que ça répond à ta problématique, tout en garantissant un minimum de fiabilité.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
20
0
Merci
Salut,

pour faire simple :

OpenProcess
puis
WriteProcessMemory
ou
ReadProcessMemory
Commenter la réponse de yann_lo_san
Messages postés
3831
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
30 janvier 2019
162
0
Merci
@yann_lo_san: Même remarque que pour aymen87. Cf mon post du vendredi 23 mars 2012 à 17:33:12

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
117
Date d'inscription
vendredi 10 février 2006
Dernière intervention
30 mars 2012
0
Merci
Salut,
La solution est simple, ton programme d'indexation ne doit pas changer. Il doit toujours écrire ses résultats quelque part (pourquoi pas dans des fichiers, après tout). Mais ton indexer, lui, ne doit pas fouiller les fichiers ! Sinon c'est clair que c'est trop lent. Il doit charger l'intégralité des fichiers en RAM au démarrage, puis lorsqu'on l'interroge, il répond en se basant sur les informations qu'il aura chargé. Le démarrage sera lent, mais l'interrogation sera très rapide. Et je pense que ça répond à ta problématique, tout en garantissant un minimum de fiabilité

j'ai pensé à ça aussi, mais c'est un peu embêtant car lorsqu'un utilisateur lance le processus de recherche, la réponse sera tout de même lente même si en réalité le programme est rapide , le temps de chargement à partir de fichiers est lent, et j'ai des données qui dépassent 1Go!
Une autre solution peut être est que le programme 1 retourne une structure (ou sont stockés les données d'entrées du programme2) au lieu des fichiers.
votre avis?
Merci
Commenter la réponse de infodaoudi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.