2016-04-27 1 views
1

Je tente d'utiliser la bibliothèque de mémoire partagée de boost pour effectuer une communication inter-processus (VS 2015). J'ai trouvé un example online ce qui est très utile. Pour l'amour de la santé, je veux juste effectuer une vérification simple que la valeur que j'ai écrite à l'adresse de la mémoire partagée est ce que je voulais. Pour ce faire, je veux imprimer la valeur de la mémoire partagée en utilisant cout. Ceci est le code que j'ai actuellement:Impression de la valeur de l'adresse de la mémoire partagée sur la ligne de commande

#include <boost\interprocess\shared_memory_object.hpp> 
#include <boost\interprocess\mapped_region.hpp> 
#include <iostream> 
#include <stdio.h> 
#include <conio.h> 
#include <cstring> 
#include <cstdlib> 
#include <string> 

int main() 
{ 
    using namespace boost::interprocess; 

    struct shm_remove 
    { 
     shm_remove() { shared_memory_object::remove("MySharedMemory"); } 
     ~shm_remove() { shared_memory_object::remove("MySharedMemory"); } 
    } remover; 

    //Create a shared memory object 
    shared_memory_object shm(create_only, "MySharedMemory", read_write); 

    //Set size to 1 
    shm.truncate(1); 

    //Map the whole shared memory in this process 
    mapped_region region(shm, read_write); 

    //Write all the memory to 1 
    std::memset(region.get_address(), 1, region.get_size()); 

    //Check that memory was initialized to 1 
    char *mem = static_cast<char*>(region.get_address()); 

    for (std::size_t i = 0; i < region.get_size(); ++i) 
    { 
     std::cout << "Memory value: " << *mem << "\n"; 
     if (*mem++ != 1) 
     { 
      return 1; //Error checking memory 
     } 
    } 
    std::cout << "press any key to quit"; 
    _getch(); 
} 

Le code fonctionne bien, pas d'erreurs sont jetés quand il vérifie que la mémoire mappée a été mis à 1. Toutefois, lorsque je tente d'imprimer ce que je pense devrait être la valeur à l'adresse, je reçois un visage souriant ...

enter image description here

quelqu'un peut-il me diriger dans la bonne direction? J'ai quelques soupçons (pas de fin \ 0?) Mais je ne comprends vraiment pas le fonctionnement interne ici. Toute aide est appréciée!

+1

Essayez 'std :: cout <<" Valeur mémoire: "<< (int) * mem <<" \ n ";' –

+0

parfait merci! – willpower2727

Répondre

3

Cast mem à int explicitement, alors std::cout va sortir la valeur comme un nombre, non pas comme une lettre correspondant au code ASCII stocké dans mem (qui peut être unprintable ou regarder drôle, ce dernier étant votre cas).

Voir cout not printing unsigned char pour une réponse plus complète sur le problème.

+0

Merci pour l'explication! – willpower2727

2

La console vous montre la représentation ASCII des octets en mémoire. Tout personnage de moins de 13 ans est généralement non imprimable. Essayez de régler la mémoire à quelque chose comme 67.

+0

Vous aviez raison, c'était l'impression ASCII rep des octets, j'ai testé avec 67 et il a imprimé "C." +1 Mais je cherchais 1, je ne savais pas exactement ce que j'essayais d'obtenir. Merci! – willpower2727

+0

A est 65, B est 66 donc 67 = C est génial! Votre code fonctionne bien :) –