Boost 範例程式:共享記憶體 - 函式庫

引入程式碼回上頁

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

#ifndef TMEMFILE_H_#define TMEMFILE_H_#include <iostream>#include <string>#include <boost/interprocess/shared_memory_object.hpp>#include <boost/interprocess/mapped_region.hpp>using namespace boost::interprocess; namespace Emprogria { class TMEMFile { private: std::string memName; size_t memSize; shared_memory_object shm; mapped_region region; public: TMEMFile(std::string memName, size_t memSize=-1); virtual ~TMEMFile(); void *Get(size_t startPos, size_t dataSize); void Put(size_t startPos, void *data, size_t dataSize); size_t GetMemSize(); }; } /* namespace Emprogria */#endif /* TMEMFILE_H_ */

程式碼

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

#include "TMEMFile.h"namespace Emprogria { TMEMFile::TMEMFile(std::string memName, size_t memSize) { if (memSize > 0) { boost::interprocess::permissions perm; perm.set_unrestricted(); shared_memory_object::remove(memName.c_str()); this->shm = shared_memory_object( create_only, memName.c_str(), read_write, perm); this->shm.truncate(memSize); this->region = mapped_region(this->shm, read_write); this->memSize = memSize; } else { this->shm = shared_memory_object(open_only, memName.c_str(), read_only); this->region = mapped_region(this->shm, read_only); this->memSize = this->region.get_size(); } this->memName = memName; } TMEMFile::~TMEMFile() { } void* TMEMFile::Get(size_t startPos, size_t dataSize) { if (startPos + dataSize > this->memSize) { std::cerr << "TMEMFile::Get" << startPos << '\t' << dataSize << std::endl; return NULL; } void *data = std::malloc(dataSize); char *p = (char *) this->region.get_address(); std::memcpy(data, p + startPos, dataSize); return data; } void TMEMFile::Put(size_t startPos, void *data, size_t dataSize) { if (startPos + dataSize > this->memSize) { std::cerr << "TMEMFile::Put" << startPos << '\t' << dataSize << std::endl; return; } char *p = (char *) this->region.get_address(); std::memcpy(p + startPos, data, dataSize); } size_t TMEMFile::GetMemSize() { return this->memSize; } } /* namespace Emprogria */