////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2006-2012. 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 //[doc_file_mapping #include #include #include #include #include #include #include #include #include //<- #include "../test/get_process_id_name.hpp" //-> int main(int argc, char *argv[]) { using namespace boost::interprocess; //Define file names //<- #if 1 std::string file_name(boost::interprocess::ipcdetail::get_temporary_path()); file_name += "/"; file_name += test::get_process_id_name(); const char *FileName = file_name.c_str(); #else //-> const char *FileName = "file.bin"; //<- #endif //-> const std::size_t FileSize = 10000; if(argc == 1){ //Parent process executes this { //Create a file file_mapping::remove(FileName); std::filebuf fbuf; fbuf.open(FileName, std::ios_base::in | std::ios_base::out | std::ios_base::trunc | std::ios_base::binary); //Set the size fbuf.pubseekoff(FileSize-1, std::ios_base::beg); fbuf.sputc(0); } //Remove on exit struct file_remove { file_remove(const char *FileName) : FileName_(FileName) {} ~file_remove(){ file_mapping::remove(FileName_); } const char *FileName_; } remover(FileName); //Create a file mapping file_mapping m_file(FileName, read_write); //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 += "\""; s+= FileName; s += "\""; //-> 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(FileName, 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(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(FileName, std::ios_base::in | std::ios_base::binary); //<- #endif //-> //Read it to memory std::vector vect(FileSize, 0); fbuf.sgetn(&vect[0], std::streamsize(vect.size())); //Check that memory was initialized to 1 const char *mem = static_cast(&vect[0]); for(std::size_t i = 0; i < FileSize; ++i) if(*mem++ != 1) return 1; //Error checking memory } } return 0; } //] #include