IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Pointeurs] partager un pointeur


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut [Pointeurs] partager un pointeur
    Salut à tous,

    Dans le but de "paralléliser" un programme sans utiliser une librairie parallèle déja existante, j'aimerais pouvoir exécuter deux exécutables différents, qui aient chacun un pointeur qui pointe vers la même variable en mémoire.

    Admettons p. ex. que j'ai un int que je veux partager

    int* a=new int(0);

    Mon idée de base était d'écrire l'adresse mémoire de a dans un fichier, qui serait lu par le second exécutable, qui créerait un pointeur de la même valeur (même adresse mémoire, ici imaginons bêtement que l'adresse mémoire est 10).

    Seulement voilà, si je fais:

    int* b=10;

    Ca ne compile pas. Seule la valeur 0 est acceptée pour les pointeurs. Dès lors, comment faire pour "partager" une variable mémoire entre deux exécutables ?

    Merci pour vos idées !

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Marche pas sur une "vraie" plate-forme, où tous les processus sont séparés par le système d'exploitation.
    Pour cela, il faut utiliser les fonctions système proposées par ton OS : shmget() (systemV) shm_open() (POSIX) ou mmap() (BSD) sous unixoïde, CreateFileMapping() sous Windows...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 384
    Points
    20 384
    Par défaut
    Citation Envoyé par L. Sierra
    int* b=10;

    Ca ne compile pas. Seule la valeur 0 est acceptée pour les pointeurs. Dès lors, comment faire pour "partager" une variable mémoire entre deux exécutables ?

    Merci pour vos idées !
    Est-ce que tu as réfléchi à ce que tu as écris ?
    Un pointeur c'est une adresse mémoire ( je conseillerais d'avoir des rudiments d'assembleur cela permet de mieux piger )
    Quand tu compiles ton programme en exe ou a.out le compilateur dans le fichier exécutable réserve un emplacement ( dans la pile de variables ) pour mémoriser l'adresse mémoire pointée par le pointeur , en général sur 32bits donc 8 octets
    Si tu assignes ce pointeur par malloc en C ou new en C++ à l'exécution , l'OS via la C-runtime va affecter à cette variable pointeur une adresse mémoire ( allocation dans le tas ou "heap" en anglais)
    Autrement dit à part valoir 0 ou NULL ce pointeur ne peut pas être affecté à une valeur fixe à la compilation puisque l'affectation se fait à l'exécution par le système.
    Dans le but de "paralléliser" un programme sans utiliser une librairie parallèle déja existante, j'aimerais pouvoir exécuter deux exécutables différents, qui aient chacun un pointeur qui pointe vers la même variable en mémoire.
    Cela est possible par les fonctionnalités de l'OS puisque c'est l'OS sur un système informatique qui est responsable de l'exécution des processus et de la gestion mémoire.
    Sous Windows par exemple il ya certains méchanismes de gestion partagée.

    Si tu veux paralléliser des taches le plus simple est la programmation multiprocessus ou multithreads..
    sinon avec Windows par exemple je crois qu'il est possible d'échanger la valeur d'une variable entre 2 exe ou dll..

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Boost va bientôt proposer un tel outil, pour partager la mémoire entre processus - outre MPI -

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce serait bien, car MPI ne fait pas à ma connaissance un partage, mais des transferts...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Normal que MPI fasse des transferts vu son nom : Message Passing Interface....

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut
    Est-ce que tu as réfléchi à ce que tu as écris ?
    Un pointeur c'est une adresse mémoire ( je conseillerais d'avoir des rudiments d'assembleur cela permet de mieux piger )
    Quand tu compiles ton programme en exe ou a.out le compilateur dans le fichier exécutable réserve un emplacement ( dans la pile de variables ) pour mémoriser l'adresse mémoire pointée par le pointeur , en général sur 32bits donc 8 octets
    Si tu assignes ce pointeur par malloc en C ou new en C++ à l'exécution , l'OS via la C-runtime va affecter à cette variable pointeur une adresse mémoire ( allocation dans le tas ou "heap" en anglais)
    Autrement dit à part valoir 0 ou NULL ce pointeur ne peut pas être affecté à une valeur fixe à la compilation puisque l'affectation se fait à l'exécution par le système.
    Oui, j'ai bien pensé à tout ça. Et pour l'annecdote je connais des bases d'assembleur sur microcontrôleurs embarqués.

    Mais il me semble clair que la seule façon de partager un pointeur entre deux applications aurait été d'allouer de la mémoire dans un exécutable, puis d'envoyer cette adresse à un autre exécutable par l'intermédiaire d'un fichier, par exemple. Sinon je ne vois pas trop comment faire !

    Mais c'est sympa quand même d'avoir répondu, apparamment il n'y a pas de moyen simple de faire ça, je suppose ... !

    A+

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par L. Sierra
    Mais il me semble clair que la seule façon de partager un pointeur entre deux applications aurait été d'allouer de la mémoire dans un exécutable, puis d'envoyer cette adresse à un autre exécutable par l'intermédiaire d'un fichier, par exemple. Sinon je ne vois pas trop comment faire !
    Sur des microcontrôleurs sans MMU, c'est faisable, mais sur des processeurs avec MMU qui ont des adresses logiques identiques mais physiques différentes selon les processus, aucune chance que ça marche.

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Aucun système d'exploitation digne de ce nom ne laisserait faire ça.
    Ce serait une faille de sécurité béante.

    Utilise boost interprocess (anciennement shmem) comme il a été proposé par exemple.
    Boost ftw

  10. #10
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 384
    Points
    20 384
    Par défaut
    Citation Envoyé par L. Sierra
    Mais il me semble clair que la seule façon de partager un pointeur entre deux applications aurait été d'allouer de la mémoire dans un exécutable, puis d'envoyer cette adresse à un autre exécutable par l'intermédiaire d'un fichier, par exemple. Sinon je ne vois pas trop comment faire !
    A+
    eh bien ce que tu veux faire là cela s'appelle un simple "pipe" ( prononcé à l'anglaise et pas autrement ).
    Ce sujet a déjà été abordé.

Discussions similaires

  1. Partager un pointeur
    Par ZeNoob dans le forum Débuter
    Réponses: 4
    Dernier message: 08/11/2012, 21h21
  2. pointeur de fonction, pointeur de méthode
    Par nico33410 dans le forum C++
    Réponses: 3
    Dernier message: 02/04/2008, 14h59
  3. Réponses: 1
    Dernier message: 16/07/2007, 13h53
  4. Difference entre pointeur REF et pointeur en Java ou C++
    Par lemagicien dans le forum Oracle
    Réponses: 4
    Dernier message: 21/03/2007, 16h01
  5. pointeurs, toujours les pointeurs :/
    Par giviz dans le forum C
    Réponses: 16
    Dernier message: 08/10/2003, 15h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo