////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2006-2009. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/interprocess for documentation. // ////////////////////////////////////////////////////////////////////////////// #include <boost/interprocess/detail/config_begin.hpp> //[doc_file_mapping #include <boost/interprocess/file_mapping.hpp> #include <boost/interprocess/mapped_region.hpp> #include <iostream> #include <fstream> #include <string> #include <vector> #include <cstring> #include <cstddef> #include <cstdlib> //<- #include "../test/get_process_id_name.hpp" //-> int main(int argc, char *argv[]) { using namespace boost::interprocess; const std::size_t FileSize = 10000; if(argc == 1){ //Parent process executes this { //Create a file std::filebuf fbuf; //<- #if 1 fbuf.open(test::get_process_id_name(), std::ios_base::in | std::ios_base::out | std::ios_base::trunc | std::ios_base::binary); #else //-> fbuf.open("file.bin", std::ios_base::in | std::ios_base::out | std::ios_base::trunc | std::ios_base::binary); //<- #endif //-> //Set the size fbuf.pubseekoff(FileSize-1, std::ios_base::beg); fbuf.sputc(0); } //Remove file on exit struct file_remove { //<- #if 1 ~file_remove (){ file_mapping::remove(test::get_process_id_name()); } #else //-> ~file_remove (){ file_mapping::remove("file.bin"); } //<- #endif //-> } destroy_on_exit; //Create a file mapping //<- #if 1 file_mapping m_file(test::get_process_id_name(), read_write); #else //-> file_mapping m_file("file.bin", read_write); //<- #endif //-> //Map the whole file with read-write permissions in this process mapped_region region(m_file, read_write); //Get the address of the mapped region void * addr = region.get_address(); std::size_t size = region.get_size(); //Write all the memory to 1 std::memset(addr, 1, size); //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; } else{ //Child process executes this { //Open the file mapping and map it as read-only //<- #if 1 file_mapping m_file(argv[2], read_only); #else //-> file_mapping m_file("file.bin", read_only); //<- #endif //-> mapped_region region(m_file, read_only); //Get the address of the mapped region void * addr = region.get_address(); std::size_t size = region.get_size(); //Check that memory was initialized to 1 const char *mem = static_cast<char*>(addr); for(std::size_t i = 0; i < size; ++i) if(*mem++ != 1) return 1; //Error checking memory } { //Now test it reading the file std::filebuf fbuf; //<- #if 1 fbuf.open(argv[2], std::ios_base::in | std::ios_base::binary); #else //-> fbuf.open("file.bin", std::ios_base::in | std::ios_base::binary); //<- #endif //-> //Read it to memory std::vector<char> vect(FileSize, 0); fbuf.sgetn(&vect[0], std::streamsize(vect.size())); //Check that memory was initialized to 1 const char *mem = static_cast<char*>(&vect[0]); for(std::size_t i = 0; i < FileSize; ++i) if(*mem++ != 1) return 1; //Error checking memory } } return 0; } //] #include <boost/interprocess/detail/config_end.hpp>