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 :

conversion valeur hexadecimal / adresse mémoire


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut conversion valeur hexadecimal / adresse mémoire
    Bonjour,

    Voici ce que je cherche à faire:
    Dans un programme (père), j'appelle un autre programme(fils) en lui passant des paramètres.

    Parmis ces paramètres passés, certains ne sont pas les valeurs des variables, mais les pointeurs ( &var).

    Dans le programme fils, qui recupère les paramètres passés, quand je fait un printf("%s\n",recupvar) de la variable qui contient le pointeur, j'obtiens dans le style: "0xbffff190", ce qui est normal...

    Maintenant, je voudrais que recupvar (fils) pointe vers cette adresse memoire (adresse qui reste bien sur dispo dans le programme père tant que le programme fils n'est pas terminé), ce que signifie que dans le programme fils si je fais un printf("%p",&recupvar), j'obtiendrais 0xbffff190, et si je fais un printf("%s",recupvar), j'obtiendrais la valeur reelle.

    Voila, j'espère que mon explication est assez claire :p

  2. #2
    Membre émérite
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Par défaut
    Salut,

    Déjà, ça pointe vers quelle type ton pointeur ?

    En imaginant que ce soit un char*, tu peux déclarer un pointeur qui prendrait la valeur de &var, puis tu l'utilises comme un simple pointeur.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char *p_var;
     
    p_var = &var;
     
    printf("Address : %p", p_var);
    printf("Content : %s", p_var);
    (N'oublie pas que quand tu affiches une chaine de caractères, on donne à printf l'adresse de début de la chaine, donc la valeur hexa vers laquelle pointe le pointeur ).

  3. #3
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut
    Merci de la réponse.

    Seulement la c'est valable que dans le cas ou var et p_var sont dans le meme programme.

    relis la description du problème stp.

    Je recupère la valeur hexa en tant que char *mavar qui est egal à la valeur hexa.

  4. #4
    Membre émérite
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Par défaut
    Je comprend pas bien ton problème...

    Tu récupère un pointeur mavar de type char* qui contient une adresse mémoire (logique c'est un pointeur...).

    Un printf("%s", mavar) permet d'afficher la valeur pointée par mavar, non ?

  5. #5
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut
    non.

    j'ai 2 programmes

    le premier programme a un pointeur char *grossevar qui contient pleins de caractères.

    Ce premier programme lance un autre programme (beaucoup beaucoup de fois).
    Ce premier programme appelle donc le 2eme programme en lui donnant des parametre:
    sprintf(params,"./program2 var1=%s, var2=%s, var3=%p...",
    var1,
    var2,
    &grossevar
    )
    system(params);

    Au lieu de passer directeemnt en parametre grossevar, ce qui consommerait de la memoire pour rien, je passe en paramètre le pointeur.

    Dans le programme suivant, je recupere les parametres en tant que char *var
    Donc, dans le programme suivant (program2),
    char *var3="adresse du pointeur";

    Seulement la, *var3 a lui meme sa propre adresse de pointeur, donc la valeur est un char qui n'est autre que l'adresse du pointeur de l'autre programme.
    Ce que je veux donc est faire pointer var3 du program2 vers l'adresse &grossevar de program 1.

    Bien evidemment, program1 ne se termine que quand il n'y a plus en process de program2

    Et evidemment, si cela etait dans le meme programme, je suis entièrement d'accord qu'il suffirait de faire:
    char *var3=&grossevar;

    Est-ce plus clair?

  6. #6
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    Il n'est pas possible de "lire" la mémoire d'un autre processus de cette façon. Chaque programme dispose de son propre espace d'adressage, et une adresse dans un programme (même si c'est exactement la même) ne contient pas la même chose que cette même adresse dans un autre programme.

    Passer une adresse d'un programme père à un autre programme (fils) n'affichera jamais le contenu de celle ci (fils ne peut pas afficher ni lire le contenu de père "simplement").

    Pour lire le contenu d'une adresse d'un programme il faut que soit :

    - Que ce soit le programme lui-même qui l'affiche.
    - Sous Unix et dérivés (Linux, etc.) : Faire du "ptracing" (utiliser ptrace avec PTRACE_ATTACH et PTRACE_PEEKDATA notamment)
    - Sous Windows : ReadProcessMemory()
    - Utiliser l'IPC (Inter Process Communication) en passant les valeurs (pas possible de "lire" directement depuis fils dans père).

    hmm, j'espère que je ne réponds pas à coté de la plaque

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par saturne13
    Voici ce que je cherche à faire:
    Dans un programme (père), j'appelle un autre programme(fils) en lui passant des paramètres.

    Parmis ces paramètres passés, certains ne sont pas les valeurs des variables, mais les pointeurs ( &var).
    Les processus étant séparés, les données sont inaccessibles. Passer l'adresse d'une donnée d'un processus à un autre processus est donc un non-sens.

    Pour faire ça, il faut soit utiliser les threads (un seul processus pour n threads), soit la mémoire partagée (SHared Memory : SHM...).

  8. #8
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut
    Ah ok, merci beaucoup

    Je vais chercher du coté de SHared Memory

  9. #9
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut
    2 heures que je rame pour.... un permission denied sur le shmat...

    Ma nouvelle question est donc.. est ce possible d'utiliser shmget/shmat sans etre en root, car il n'y a que en passant en root que je n'a pas ce problème de permission denied sur le shmat..


    (j'ai essayé aussi de lui spécifier les permissions, mais evidemment ca ne change rien puisque d'après ce que j'ai lu, le systeme ne gere pas ca)

    Merci beaucoup pour vos réponses

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par saturne13
    2 heures que je rame pour.... un permission denied sur le shmat...

    Ma nouvelle question est donc.. est ce possible d'utiliser shmget/shmat sans etre en root, car il n'y a que en passant en root que je n'a pas ce problème de permission denied sur le shmat..


    (j'ai essayé aussi de lui spécifier les permissions, mais evidemment ca ne change rien puisque d'après ce que j'ai lu, le systeme ne gere pas ca)
    La programmation Linux, c'est ici :

    http://www.developpez.net/forums/forumdisplay.php?f=327

  11. #11
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 14
    Par défaut
    ah; désolé

Discussions similaires

  1. Lire la valeur d'une adresse mémoire
    Par barhili04 dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 11/11/2009, 10h44
  2. Comment modifier la valeur d'une adresse mémoire ?
    Par copterkill dans le forum Windows
    Réponses: 6
    Dernier message: 08/02/2009, 22h18
  3. Réponses: 1
    Dernier message: 30/12/2008, 08h19
  4. Réponses: 15
    Dernier message: 30/09/2008, 23h36
  5. lire la valeur d'une adresse mémoire
    Par ilimo dans le forum Windows
    Réponses: 17
    Dernier message: 11/04/2006, 15h21

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