Communication interprocessus

Résolu
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012 - 23 mars 2012 à 10:15
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre 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.

24 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
27 mars 2012 à 13:29
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
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
23 mars 2012 à 11:18
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
0
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012
23 mars 2012 à 11:54
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:)
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
23 mars 2012 à 12:04
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
23 mars 2012 à 12:07
(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
0
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012
23 mars 2012 à 12:46
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??:)
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
23 mars 2012 à 12:56
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
0
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012
23 mars 2012 à 13:10
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à
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
23 mars 2012 à 13:19
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
0
cs_aymen87 Messages postés 109 Date d'inscription samedi 3 novembre 2007 Statut Membre Dernière intervention 4 février 2016
23 mars 2012 à 17:24
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
23 mars 2012 à 17:33
@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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 mars 2012 à 19:59
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++
0
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012
25 mars 2012 à 12:07
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...
0
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012
25 mars 2012 à 12:13
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.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
25 mars 2012 à 12:53
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
0
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012
25 mars 2012 à 13:25
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à:)
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
25 mars 2012 à 14:03
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
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 mars 2012 à 12:57
Salut,

pour faire simple :

OpenProcess
puis
WriteProcessMemory
ou
ReadProcessMemory
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
26 mars 2012 à 15:22
@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
0
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012
26 mars 2012 à 23:29
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
0
Rejoignez-nous