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 :

Pointeur sur une zone appartenant à un autre programme


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut Pointeur sur une zone appartenant à un autre programme
    Bonjour,

    Bon, ma question est la suivante:
    je veut savoir si c'est possible de se pointer sur une zone allouer par un autre programme ( c à d dans sa zone mémoire ) ?

    je m'explique, dans une zone mémoire partager, j'ai d'eclarer un pointeur P, au cours de l'execution du programme A, j'ai stocké dans le pointeur P l'addresse d'une fonction.
    Dans un autre programme B, je veut utiliser la fonction avec l'addresse de celle çi ( déja stocké dans la mémoire partager )

    De la premiere vue ça doit pas marcher, mais si on stocke la fonction dans une bibliothéque dynamique, et on fait le meme operation, est ce que ça devra marcher ?

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Oui, c'est possible, mais compliqué.

    Avec windows, on appellera CreateSharedMemory et AllocateSharedMemory. Je n'en sais pas plus...

    En POSIX (?) on crée la mémoire et on y accède avec shmget,
    on travaille dessus avec shmat
    et on la supprime avec shmdt.
    Le tout est inclu dans <sys/shm.h>

    Un premier process crée la mémoire en lui donnant un certain numéro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int memID = shmget(11111, taille, 0666 | IPC_CREAT));
    /*
      11111 est la clef
      taille est la taille de la zone mémoire
      0666 est le code de droit sur la mémoire.
    */
    /*Une fois créée, on la récupère :*/
    void *pMemoire = shmat(memID, NULL, 0);
    Dans l'autre processus, presque la même chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int memID = shmget(11111, taille, 0444);
     
    void * pMemoire = shmat(memID, NULL, 0);
    A prendre avec des pincettes quand même...

  3. #3
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Au final, le pointeur de fonction n'est que l'adresse d'une fonction, donc si ta bibliothèque est chargée au même endroit dans l'espace d'adressage des 2 processus, ça doit marcher.

  4. #4
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Au final, le pointeur de fonction n'est que l'adresse d'une fonction, donc si ta bibliothèque est chargée au même endroit dans l'espace d'adressage des 2 processus, ça doit marcher.
    et comment savoir que la fonction est chargée au meme endoit dans l'espace memoire ?



    MERCI mabu, mais je savais tous ça

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    CreateSharedMemory() est réservé à des situations précises d'authentification.
    La bonne méthode pour obtenir de la mémoire partagée sous Windows, c'est CreateFileMapping() et MapViewOfFile()...
    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
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    je suis sous linux, alors, j'ai pas fait attention au fonction utiliser sous Windows......

    MERCI comme meme !!!!

  7. #7
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par cmoibal Voir le message
    et comment savoir que la fonction est chargée au meme endoit dans l'espace memoire ?
    Ce n'est pas la fonction, mais la bibliothèque ou ton executable qui est chargé. le problème est que pour des raisons de sécurité, depuis peu, ce chargement est fait à des adresses aléatoires, comportement qui peut être désactivé si tu veux t'exercer un peu :
    http://fr.wikipedia.org/wiki/Address..._randomization

  8. #8
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    j'ai pas bien compris la notion.......

    Tous que je sais, c'est une foix le code est compilé, les addresse des fonctions sont inchanger (dans l'executable).....donc, si le chargement d'une bibliothèque se fait dans des endroit aleatoires de la memoire, on ne peut pas vraiment se pointer la dessus.......

    En plus, les addresse des fonctions partagés ( shared lib ) sont gérer par le gestionnaire de linkaage systèmes, il a comme rolle de faire la correspondance entre l'addressede la fonction demander par l'addresse reel donner lors du chargement de la bibliothèque....

    En ajoutant a ça, tout programme a sa propres zone d'addressage, donc, l'addresse globale d'une fonction n'est pas vraiment detectable par un autre programme......


    est ce que alors c'est possible de passer une addresse d'une fonction, d'un programme A à un programme B ?

  9. #9
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Non, si aslr n'est pas activé, par défaut, les bibliothèques et exécutables se chargent généralement à la même adresse dans l'espace d'adressage.

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/03/2013, 06h48
  2. Réponses: 4
    Dernier message: 23/12/2009, 12h26
  3. Changer la forme du pointeur sur une zone edit
    Par Pierrot92320 dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 29/06/2009, 19h08
  4. Réponses: 5
    Dernier message: 29/06/2006, 17h23
  5. Réponses: 8
    Dernier message: 30/05/2006, 01h26

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