GameCorp - Index des forumsGame MakingProgrammationLangages C et C++Appel de fonctions inter-process
Appel de fonctions inter-process
| Darktib |
Posté le 03 Déc 2008 à 21:23
|
|
![]() Messages : 4017 GCPoints : 347288 |
Hello, Est-ce que quelqu'un pourrait m'aider sur ce point: j'ai un programme qui enregistre l'adresse d'un objet dans une zone de mémoire partagée. Un autre processus, a son lancement, lit la valeur de l'adresse de l'objet, et, comme les deux processus utilisent strictement le meme type d'objet (meme header dans chacun des projets) j'aimerais que le processus lancé puisse appeler une fonction de l'objet dont l'adresse est dans la zone partagée. J'ai essayé avec volatile - mais ca compile pas. Et en y allant directement, je récupere bien l'adresse mais l'appel a la fonction se solde par une segfault, la fonction "n'appartenant" pas au processus qui l'appelle... 'espere que je n'ai pas été trop incompréhensible^^ Any idea? Merci d'avance |
|
| freemaul |
Posté le 03 Déc 2008 à 22:15
|
|
![]() Messages : 174 GCPoints : 50213 |
Vu que les OS font en sorte qu'un processus ne puissent pas avoir accé a la mémoire d'un autre processus (ce qui provoque un segfault) je ne pense pas que tu puisse faire comme cela. A mon avis il ne faut pas que tu écrive l'adresse de l'objet dans la mémoire partagée, mais que l'objet lui même soit dans cette mémoire partagé, ainsi tes deux processus pouront y avoir accés.
"La vie n'a pas de prix, mais elle coûte chère"
|
|
| dstar |
Posté le 03 Déc 2008 à 22:50
|
|
![]() Messages : 56 GCPoints : 25718 |
Il y a plusieurs problèmes qui risquent de rendre ta technique difficilement utilisable. Un premier point: freemaul a raison. Pour que les 2 processus accèdent aux données gérées par l'objet en question, il faut que l'objet ait été entièrement alloué dans la mémoire partagée: aussi bien la structure de l'objet lui-même que les différents champs qui le composent. Si ces champs sont des pointeurs ou des références, pour que le code des 2 processus puissent accéder aux données référencées, il faut que ces pointeurs ou références pointent sur des zones de la mémoire partagée... ou alors, il ne faut pas les utiliser. Pour allouer un objet dans une zone de mémoire partagée, la seule solution que je vois est de surcharger l'opérateur new de la classe de l'objet pour que cet opérateur puisse retourner une adresse relative à la mémoire partagée. Ensuite vient le souci de partager l'adresse de l'objet entre les 2 processus, car, pour chacun d'entre eux, cet objet se situera à une adresse différente. La meilleure solution est que le processus qui crée l'objet calcule l'offset entre l'adresse de l'objet et l'adresse de début de la zone partagée. Il suffit de stocker cet offset à une adresse précise dans la zone partagée (par exemple, l'adresse de début) pour que le second processus puisse le lire. Une fois lu, le second processus ajoute cet offset à l'adresse de la zone partagée (qui n'est pour lui, pas la même que le premier processus) pour obtenir l'adresse de l'objet. Enfin, il ne faut pas que le second processus appelle une opération virtuelle de l'objet, sinon, l'adresse de l'opération virtuelle sera invalide pour lui. De même pour l'opérateur dynamic_cast. Je ne garantis pas que ça va fonctionner, mais sait-on jamais ;) dstar
dstar
|
|
| Darktib |
Posté le 04 Déc 2008 à 21:44
|
|
![]() Messages : 4017 GCPoints : 347288 |
Pour les pointeurs il me semble que les adresses stockées sont absolues, pas relatives au programme ? Sinon je précise que c'est le meme executable qui est lancé deux fois, si l'un des deux voie qu'il n'est pas le premier lancé il lit l'adresse dans la mémoire partagée puis appelle une fonction de l'objet principal, qui malheureusement ne peut pas etre crée dans la mémoire partagée... L'objet en question n'est crée que dans le premier programme lancé. Pour ceux qui aimerait savoir de quel objet il s'agit, il s'agit tout simplement de l'éditeur de tutos (fenetre plus tout le reste) Enfin, je peux toujours essayer, mais je ne garantie rien... J'ai une solution, qui consiste a lire toutes les x (x apparenant a R+*) secondes, puis vérifier si il faut appeler la fonction, mais je n'aime pas cette solution. J'avais pensé a utiliser des dlls, lequelles stockeraient deux-trois variables et feraient du call-back a outrance, mais pour ca il faut que les données de la dll ne soient pas dupliquées... Il me semble qu'on peut se rendre 'ami' d'un processus pour pouvoir appeller ses fonction, etc... (par gdb et les autres débuggueurs arrivent trse bien a le faire - a moins que je dise n'importe quoi) |
|
| chaos |
Posté le 05 Déc 2008 à 16:35
|
|
![]() Messages : 127 GCPoints : 11604 |
En C avec vfork le processus père et le fils partage la même zone mémoire. EDIT : sinon une pseudo serialization tu écrit les données dans une fichier par exemple et reconstitue l'object via ces données ou alors tu communique ces données via un pipe entre les deux processus (c'est assez facile avec une redirection de l'entrée et la sortie standard).
Dernière édition le 05 Déc 2008 à 16:38
"c'est un fait, on obtient plus facilement en demandant poliment une arme a la main qu'en demandant juste poliment."
http://www.doujin-spirit.net/ |
|
| Darktib |
Posté le 05 Déc 2008 à 20:46
|
|
![]() Messages : 4017 GCPoints : 347288 |
Pour l'échange de données, c'est pas trop compliqué. Par contre ce qui m'interesse surtout est l'appel direct de fonction. Je vais regarder ce qu'est vfork |
|
GameCorp - Index des forumsGame MakingProgrammationLangages C et C++Appel de fonctions inter-process
Répondre

