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 :

Echange de variables entre 2 programmes grâce au type VOLATILE


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2013
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 26
    Par défaut Echange de variables entre 2 programmes grâce au type VOLATILE
    Bonjours,
    J'ai lu plusieurs informations de ce genre : "Le préfixe volatile est notamment utilisé quand la variable d'un programme peut être modifiée par un autre programme"(Wikipédia).

    Cela veut donc t-il bien dire que l'on peut déclarer une variable dans un prgm A, et récuperer sa valeur dans un prgm B (en communiquant l'adresse de la variable) ?

    J'ai essayé, mais la valeur récuperée est fausse... Où est le problème ? Merci d'avance!

    Code A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    volatile char variable = 42;
    printf("Variable : %d\nAdresse : %p\n", variable, &variable);
    Code B :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *ptr;
    scanf("%p", &ptr);
    printf("Variable : %d\n", *ptr);

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par 2poules Voir le message
    Cela veut donc t-il bien dire que l'on peut déclarer une variable dans un prgm A, et récuperer sa valeur dans un prgm B (en communiquant l'adresse de la variable) ?
    non, quand les deux programmes partagent le même espace d'adressage, dans le cas des threads donc, ce qui programmatiquement parlant se traduit par 1 seul code source, 1 seul programme, 2 (ou plus) processus qui tournent et accèdent à la même variable (qu'il connaissent donc, pas de passage d'adresse ou autre)

    par ailleurs la page Wikipédia en anglais est plus complète sur la question (toujours regarder la version EN, toujours )

  3. #3
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par 2poules Voir le message
    J'ai essayé, mais la valeur récuperée est fausse... Où est le problème ? Merci d'avance!
    Chaque process se croit être le seul à s’exécuter et croit qu'il a accès à 2^32 (sur système 32 bits), ou 2^64 (sur système 64 bits) octets de RAM.
    C'est le rôle de l'OS de faire croire ça à chaque process.
    -> Les process sont totalement indépendants et tu dois passer par l'OS pour accéder à la mémoire d'un autre process (seul l'OS sait qu'il existe plusieurs process simultanément).

    Sur Windows, une adresse est de la forme baseAdresse + offset, quand tu travailles avec les adresses (via des pointeurs), tu travailles directement sur la somme des deux, c'est transparent pour le dev.
    Plusieurs process peuvent avoir la même baseAdresse, mais il n'est pas garanti qu'un même process lancé plusieurs fois d'affilé aura la même baseAdresse (si tu veux plus d'infos, regarde du coté de l'ASLR).

    Pour ce que tu cherches à faire marche, il faut faire (en pseudocode)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // var.exe
    int variable = 42;
    int& addrVariable = &variable;
     
    void *baseOfVar_Exe = baseOfThisProcess();
    void *offsetOfVariableInVar_Exe = addrVariable - baseOfVar_Exe;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // readVar.exe
    HANDLE h = OpenProcess("var.exe", READ_ACCESS, baseOfVar_Exe); // ouvre le process var.exe en demandant un acces en lecture à sa mémoire, il faut fournir la base
    int *ptr = ReadProcessMemory(h, offsetOfVariableInVar_Exe, sizeof(int));
     
    printf("%d\n", *ptr);
    Mais, ce n'est clairement pas la façon de faire pour partager des données entre process.
    Regarde plutôt du coté de la mémoire partagée ou des sockets.
    Il est aussi possible d'utiliser des threads et non pas des process: le partage d'infos entre threads est bien plus simple.

  4. #4
    Membre averti
    Inscrit en
    Mai 2013
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 26
    Par défaut
    D'accord, merci pour ces explications je comprend mieux pourquoi ce n'est pas possible!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [facile] passage de variable entre 2 programmes
    Par jabal64 dans le forum Général Python
    Réponses: 7
    Dernier message: 07/12/2012, 23h28
  2. Echange de paramètres entre deux programmes
    Par SmileSoft dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 23/04/2011, 22h29
  3. [Toutes versions] Echange de variables entre plusieurs fonctions
    Par vivi4561 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/10/2009, 16h40
  4. Echange de variables entre plusieurs formulaires
    Par manuel31 dans le forum IHM
    Réponses: 1
    Dernier message: 08/09/2008, 20h01
  5. [TP] Echanger des données entre deux programmes
    Par ILIAS Raphaël dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 22/03/2005, 09h31

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