1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
//////////////////////////////////////////////////////////////////////////////
//
// (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.
//
//////////////////////////////////////////////////////////////////////////////
//[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;
//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<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(FileName, 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;
}
//]
|