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; }
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; };
//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; };
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; }