file_mapping_test.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 143 行
CPP
143 行
////////////////////////////////////////////////////////////////////////////////// (C) Copyright Ion Gaztanaga 2004-2007. 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>#include <ios> //std::streamoff#include <fstream> //std::ofstream, std::ifstream#include <iostream>#include <boost/interprocess/file_mapping.hpp>#include <boost/interprocess/mapped_region.hpp>#include <memory> //std::auto_ptr#include <stdexcept> //std::exception#include <cstdio> //std::remove#include <cstddef> //std::size_t#include "get_process_id_name.hpp"using namespace boost::interprocess;int main (){ try{ const std::size_t FileSize = 99999*2; { //Create file with given size std::ofstream file(test::get_process_id_name(), std::ios::binary | std::ios::trunc); file.seekp(static_cast<std::streamoff>(FileSize-1)); file.write("", 1); } { //Create a file mapping file_mapping mapping(test::get_process_id_name(), read_write); //Create two mapped regions, one half of the file each mapped_region region (mapping ,read_write ,0 ,FileSize/2 ); mapped_region region2(mapping ,read_write ,FileSize/2 ,FileSize - FileSize/2 ); //Fill two regions with a pattern unsigned char *filler = static_cast<unsigned char*>(region.get_address()); for(std::size_t i = 0 ;i < FileSize/2 ;++i){ *filler++ = static_cast<unsigned char>(i); } filler = static_cast<unsigned char*>(region2.get_address()); for(std::size_t i = FileSize/2 ;i < FileSize ;++i){ *filler++ = static_cast<unsigned char>(i); } } //See if the pattern is correct in the file { //Open the file std::ifstream file(test::get_process_id_name(), std::ios::binary); //Create a memory buffer std::auto_ptr<unsigned char> memory (new unsigned char [FileSize/2 +1]); //Fill buffer file.read(static_cast<char*>(static_cast<void*>(memory.get())) , FileSize/2); unsigned char *checker = memory.get(); //Check pattern for(std::size_t i = 0 ;i < FileSize/2 ;++i){ if(*checker++ != static_cast<unsigned char>(i)){ return 1; } } //Fill buffer file.read(static_cast<char*>(static_cast<void*>(memory.get())) , FileSize - FileSize/2); checker = memory.get(); //Check pattern for(std::size_t i = FileSize/2 ;i < FileSize ;++i){ if(*checker++ != static_cast<unsigned char>(i)){ return 1; } } } //Now check the pattern mapping a single read only mapped_region { //Create a file mapping file_mapping mapping(test::get_process_id_name(), read_only); //Create a single regions, mapping all the file mapped_region region (mapping ,read_only ); //Check pattern unsigned char *pattern = static_cast<unsigned char*>(region.get_address()); for(std::size_t i = 0 ;i < FileSize ;++i, ++pattern){ if(*pattern != static_cast<unsigned char>(i)){ return 1; } } } { //Now test move semantics file_mapping mapping(test::get_process_id_name(), read_only); file_mapping move_ctor(detail::move_impl(mapping)); file_mapping move_assign; move_assign = detail::move_impl(move_ctor); } } catch(std::exception &exc){ std::remove(test::get_process_id_name()); std::cout << "Unhandled exception: " << exc.what() << std::endl; throw; } std::remove(test::get_process_id_name()); return 0;}#include <boost/interprocess/detail/config_end.hpp>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?