Exemplo n.º 1
0
int main(int argc, char *argv[])
{
	if (argc == 1)
	{
		struct shm_remove
		{
			shm_remove()  { shared_memory_object::remove("MySharedMemory"); }
			~shm_remove() { shared_memory_object::remove("MySharedMemory"); }
		} remover;

		// Create a new segment with given name and size
		managed_shared_memory segment(create_only, "MySharedMemory", 65536);

		// Initialize shared memory STL-compatible allocator
		const ShmemAllocator alloc_inst(segment.get_segment_manager());

		// Construct a vector named "MyVector" in shared memory with argument alloc_inst
		MyVector *myvector = segment.construct<MyVector>("MyVector")(alloc_inst);

		for (int i = 0; i < 100; ++i)
		{
			myvector->push_back(i);
		}

		// Launch child process
		std::string s(argv[0]); s += " child ";
		if (0 != std::system(s.c_str()))
			return 1;

		if (segment.find<MyVector>("MyVector").first)
			return 1;
	}
	else
	{
		managed_shared_memory segment(open_only, "MySharedMemory");

		MyVector *myvector = segment.find<MyVector>("MyVector").first;

		std::sort(myvector->rbegin(), myvector->rend());

		segment.destroy<MyVector>("MyVector");
	}

	return 0;
}
Exemplo n.º 2
0
int main(int argc, char *argv[])
{
   if(argc == 1){ 
      struct shm_remove
      {
         shm_remove() { shared_memory_object::remove("MySharedMemory"); }
         ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
      } remover;

      managed_shared_memory segment(create_only, "MySharedMemory", 65536);

      const ShmemAllocator alloc_inst (segment.get_segment_manager());

      MyVector *myvector = segment.construct<MyVector>("MyVector")(alloc_inst);

      for(int i = 0; i < 100; ++i)  //Insert data in the vector
         myvector->push_back(i);

      std::string s(argv[0]); s += " child ";
      if(0 != std::system(s.c_str()))
         return 1;

      if(segment.find<MyVector>("MyVector").first)
         return 1;
   }
   else{ 
      managed_shared_memory segment(open_only, "MySharedMemory");
      MyVector *myvector = segment.find<MyVector>("MyVector").first;
      std::sort(myvector->rbegin(), myvector->rend());
      for(int i = 0; i < 100; ++i)  //Insert data in the vector
      {
        printf("%d ", myvector->at(i));
      }
      segment.destroy<MyVector>("MyVector");
   }

   return 0;
};
Exemplo n.º 3
0
//Main function. For parent process argc == 1, for child process argc == 2
int main(int argc, char *argv[])
{
   if(argc == 1){ //Parent process
      //Remove shared memory on construction and destruction
      struct shm_remove
      {
      //<-
      #if 1
         shm_remove() { shared_memory_object::remove(test::get_process_id_name()); }
         ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); }
      #else
      //->
         shm_remove() { shared_memory_object::remove("MySharedMemory"); }
         ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
      //<-
      #endif
      //->
      } remover;
      //<-
      (void)remover;
      //->

      //Create a new segment with given name and size
      //<-
      #if 1
      managed_shared_memory segment(create_only, test::get_process_id_name(), 65536);
      #else
      //->
      managed_shared_memory segment(create_only, "MySharedMemory", 65536);
      //<-
      #endif
      //->

      //Initialize shared memory STL-compatible allocator
      const ShmemAllocator alloc_inst (segment.get_segment_manager());

      //Construct a vector named "MyVector" in shared memory with argument alloc_inst
      MyVector *myvector = segment.construct<MyVector>("MyVector")(alloc_inst);

      for(int i = 0; i < 100; ++i)  //Insert data in the vector
         myvector->push_back(i);

      //Launch child process
      std::string s(argv[0]); s += " child ";
      //<-
      s += test::get_process_id_name();
      //->
      if(0 != std::system(s.c_str()))
         return 1;

      //Check child has destroyed the vector
      if(segment.find<MyVector>("MyVector").first)
         return 1;
   }
   else{ //Child process
      //Open the managed segment
      //<-
      #if 1
      managed_shared_memory segment(open_only, argv[2]);
      #else
      //->
      managed_shared_memory segment(open_only, "MySharedMemory");
      //<-
      #endif
      //->

      //Find the vector using the c-string name
      MyVector *myvector = segment.find<MyVector>("MyVector").first;

      //Use vector in reverse order
      std::sort(myvector->rbegin(), myvector->rend());

      //When done, destroy the vector from the segment
      segment.destroy<MyVector>("MyVector");
   }

   return 0;
};
Exemplo n.º 4
0
int main ()
{
    using namespace boost::interprocess;
    //Remove shared memory on construction and destruction
    struct shm_remove
    {
        //<-
#if 1
        shm_remove() {
            shared_memory_object::remove(test::get_process_id_name());
        }
        ~shm_remove() {
            shared_memory_object::remove(test::get_process_id_name());
        }
#else
        //->
        shm_remove() {
            shared_memory_object::remove("MySharedMemory");
        }
        ~shm_remove() {
            shared_memory_object::remove("MySharedMemory");
        }
        //<-
#endif
        //->
    } remover;

    //A managed shared memory where we can construct objects
    //associated with a c-string
    //<-
#if 1
    managed_shared_memory segment(create_only,test::get_process_id_name(), 65536);
#else
    //->
    managed_shared_memory segment(create_only,
                                  "MySharedMemory",  //segment name
                                  65536);
    //<-
#endif
    //->

    //Alias an STL-like allocator of ints that allocates ints from the segment
    typedef allocator<int, managed_shared_memory::segment_manager>
    ShmemAllocator;

    //Alias a vector that uses the previous STL-like allocator
    typedef vector<int, ShmemAllocator> MyVector;

    int initVal[]        = {0, 1, 2, 3, 4, 5, 6 };
    const int *begVal    = initVal;
    const int *endVal    = initVal + sizeof(initVal)/sizeof(initVal[0]);

    //Initialize the STL-like allocator
    const ShmemAllocator alloc_inst (segment.get_segment_manager());

    //Construct the vector in the shared memory segment with the STL-like allocator
    //from a range of iterators
    MyVector *myvector =
        segment.construct<MyVector>
        ("MyVector")/*object name*/
        (begVal     /*first ctor parameter*/,
         endVal     /*second ctor parameter*/,
         alloc_inst /*third ctor parameter*/);

    //Use vector as your want
    std::sort(myvector->rbegin(), myvector->rend());
    // . . .
    //When done, destroy and delete vector from the segment
    segment.destroy<MyVector>("MyVector");
    return 0;
}