Boost logo

Boost Users :

Subject: [Boost-users] [interprocess 1.42] Copy multiple variables into shared memory
From: Michael Behnke (michael.behnke_at_[hidden])
Date: 2014-10-13 06:00:56


Hello,

I'm trying to write multiple variables one by one into a mapped_region,
but somehow I fail. Here is the Code I worked on so far:

     boost::interprocess::shared_memory_object
shm_obj(boost::interprocess::open_or_create, "Test",
boost::interprocess::read_write);
     shm_obj.truncate(1000);
     boost::interprocess::mapped_region region(shm_obj,
boost::interprocess::read_write, 0, 0);

     uint32_t size = 33;
     uint32_t type = 666;
     std::string data("I'm a Test!");

     uint32_t* start_ptr_int = &(static_cast<uint32_t*>
(region.get_address())[0]);
     std::memcpy(start_ptr_int, &size, sizeof (uint32_t));

     start_ptr_int = &(static_cast<uint32_t*> (region.get_address())[4]);
     std::memcpy(start_ptr_int, &type, sizeof (uint32_t));

     char* start_ptr_char = &(static_cast<char*> (region.get_address())[8]);
     std::memcpy(start_ptr_char, data.c_str(), data.length());

     uint32_t sizeOfData;
     std::memcpy(&sizeOfData, &(static_cast<uint32_t*>
(region.get_address())[0]), sizeof (uint32_t));

     uint32_t typeOfData;
     std::memcpy(&typeOfData, &(static_cast<uint32_t*>
(region.get_address())[4]), 4);

     char* revData = new char[sizeOfData];
     std::memcpy(revData, &(static_cast<char*>
(region.get_address())[sizeof (uint32_t) * 2]), sizeOfData);

First I write an uint32_t into the region at index 0. Afterwards, I'm
writing another uint32_t at position 4 (assuming the first uint32_t took
the bytes 0 - 3).
Last I write a string into the region, at index 8. Reading the first
uint32_t again from shared memory works fine, as does reading the string
(the last variable). But if I try to read the second variable
(uint32_t) the data is not what I expected. I know that the problem is
memcpy, somehow my syntax does not work. Unfortunately I could not find
a matching example, cause mostly memset is used to
explain the functionality of boost::mapped_region. I have to write lots
of data into shared memory (structured like
size1|type1|data1|...|sizeN|typeN|dataN) but still can't figure out how
to do this the right way.
Any suggestions are greatly appreciated.

Kind regards

Michael Behnke
  

-- 
Bachelorand
________________________________________________________
  
ADITION technologies AG
Schwarzwaldstraße 78b
79117 Freiburg
  
http://www.adition.com
  
T +49 / (0)761 / 88147 - 30
F +49 / (0)761 / 88147 - 77
SUPPORT +49  / (0)1805 - ADITION
  
(Festnetzpreis 14 ct/min; Mobilfunkpreise maximal 42 ct/min)
  
Eingetragen beim Amtsgericht Düsseldorf unter HRB 54076
Vorstände: Andreas Kleiser, Jörg Klekamp, Marcus Schlüter
Aufsichtsratsvorsitzender: Joachim Schneidmadl
UStIDNr.: DE 218 858 434

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net