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

Windows Discussion :

Ai-je correctement utilisé le mapping ?


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Ai-je correctement utilisé le mapping ?
    Bonjour,
    J’ai utilisé le mapping pour partager des données, ça marche, je récupère bien mes données, mais je ne suis pas sûr que mon utilisation soit correcte.
    Voila, j'ai considéré au départ (sûrement à tort) que écrire ou lire dans un
    fichier mémoire ça marchait comme read ou write sur un support disque
    quelconque, c'est à dire qu'au début,
    pour sauvegarder mes données j’ai fait une petite fonction savedata() qui fait (en enlevant les tests pour simplifier):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1.- hdlemap = CreateFileMapping((HANDLE)0xFFFFFFFF, .....,Mymapname);
    2.- ptrmap = MapViewOfFile(hdlemap, ....);
    3.- CopyMemory(ptrmap, &Mesdonnees,...); // Mesdonnees  mapping
    4.- CloseHandle(hdlemap ); // je ferme ici comme un fichier sur disque
    sachant que comme pour un fichier le CreateFileMapping est équivalent à un
    OpenFileMapping si un fichier de même nom existe déjà.
    Pour restorer mes données j’ai fait sur le même style une petite fonction restoredata() qui fait presque la même chose : (à part l’instruction Copy qui est inversée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1.- hdlemap = CreateFileMapping((HANDLE)0xFFFFFFFF, .....,Mymapname);
    2.- ptrmap = MapViewOfFile(hdlemap, ....);
    3.- CopyMemory(&Mesdonnees, ptrmap,...); // Mapping  Mesdonnees
    4.- CloseHandle(hdlemap ); // je ferme ici comme un fichier sur disque
    Et je me suis aperçu que ça ne marchait pas, je ne récupérais pas mes
    données, j'ai alors enlevé simplement l'instruction CloseHandle et
    maintenant ça marche nickel, je récupère bien mes données. Cependant dans
    cette procédure il y a quelque chose qui ne me paraît pas logique bien que
    ça fonctionne, en effet du fait que j'ai enlevé l'instruction CloseHandle on
    peut considérer que le mapping est resté ouvert, or à chaque entrée dans une procédure de save ou de restore je suis amené à faire un CreateFileMapping c'est à dire en fait l'équivalent d'un Open sur un fichier déjà ouvert ! il y a quelque chose de dérangeant pour l'esprit et je suis étonné que le système l'accepte !
    Ai-je donc bien tout compris ? et est-ce bien ainsi qu'il faut procéder ?
    Merci

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Je pense (sans en être sûr) que cela est du au fait que lors de la premier écriture, tu créés bien ta mémoire partagée mais comme tu fais un close(), le système détruit la mémoire partagée (plus personne n'est attaché dessus, pas de raison de la garder).

    En général, pour les mémoires partagées, tu ouvres/créés ta mémoire en début de programme, les client ouvrent aussi en début de programme. Tant que quelqu'un est "collé" sur cette mémoire, le système maintient l'existence cette mémoire.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Mapping suite
    Merci pour la réponse. Par contre, j'ai continué à faire des tests, j'ai remplacé systématiquement le createfilemapping par un openfilemapping et je ne fais le createfilemapping que si le openfilemapping échoue et dans ce cas je conserve bien mes données dans la mémoire mappée même en réintroduisant les closehandle !
    Il semblerait donc que la conclusion ces tests ont l'air de démontrer soit la suivante:
    Les closehandle ne seraient pas en cause, ils ne feraient pas perdre la mémoire mappée. Le problème viendrait uniquement du createfilemapping qui fonctionnerait de la manière suivante:
    1.- lorsqu'on fait un createfilemapping sur un nom de fichier createfilemapping(toto,....) il se comporterait effectivement comme un createfile(toto,....), c'est à dire que si le fichier existe déjà le createfilemapping devient équivalent à un openfilemapping.
    2.- Par contre lorsqu'on fait un createfilemapping pour de la mémoire, même avec un nom d'objet map: createfilemapping(0xFFFF,....,mamap), il aurait deux comportement différents selon que la map a été ou non fermée par closehandle.
    2.1.- si la map n'a pas été fermée, comme le createfile il est équivalent à un openfilemapping.
    2.2.- si la map a été fermée par un closehandle, il recrée une nouvelle zone de mapping vierge avec le même nom de map, mais la faute n'est pas à imputer au closehandle puisque lorsque je remplace le createfilemapping par un openfilemapping je retrouve bien la zone qui contient mes données et qui avait pourtant été fermée précédemment par un closehandle.
    A confirmer ou infirmer donc éventuellement,
    A+

  4. #4
    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
    En gros, tu veux dire qu'un File Mapping persisterait quelque temps après la fermeture de tous ses handles?

    PS: Pourquoi utilises-tu 0xFFFFFFFF quand tu peux utiliser INVALID_HANDLE_VALUE comme la doc l'indique?
    PPS: Où sont les appels à UnmapViewOfFile?
    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.

Discussions similaires

  1. $_SESSION utilisé correctement ?
    Par Invité dans le forum Langage
    Réponses: 11
    Dernier message: 01/11/2008, 16h21
  2. Réponses: 4
    Dernier message: 02/06/2008, 13h14
  3. Réponses: 3
    Dernier message: 03/08/2007, 07h36
  4. [destructeur] Detruire correctement une map
    Par poukill dans le forum C++
    Réponses: 6
    Dernier message: 04/07/2007, 10h22
  5. [MR] L'héritage est il correctement utilisé ?
    Par fabszn dans le forum Schéma
    Réponses: 2
    Dernier message: 22/03/2007, 22h59

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