Boost的文件内存映射

 boost文件内存映射的使用方法

boost_mapping_file.cpp

#include <boost/interprocess/file_mapping.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <iostream>
using namespace boost::interprocess;

int main()
{
    char file_name[64] = {0};
    int count = 1;
    int file_size = 1024 * 1024 * 1024 * 1; // GB
    for(int i=0; i<count; ++i)
    {
        sprintf(file_name, "./files/f_%d", i);
        boost::interprocess::file_handle_t _handle = ipcdetail::create_or_open_file(file_name, read_write, permissions(),false);
        boost::interprocess::ipcdetail::truncate_file(_handle, file_size);
        boost::interprocess::ipcdetail::close_file(_handle);
        file_mapping *mf = new file_mapping(file_name, read_write);
        mapped_region *region = new mapped_region(*mf, read_write);
        void *addr = region->get_address();
        std::cout << addr << std::endl;
        memset(addr, 'h', file_size); // 写入数据,此时占用内存1GB(file_size)
        region->flush();
        getchar();
        _handle=boost::interprocess::ipcdetail::open_existing_file(file_name,read_write,false); // 再次打开文件,写入内容
        boost::interprocess::ipcdetail::set_file_pointer(_handle,0,file_end);
        std::string data;
        data.resize(file_size);
        boost::interprocess::ipcdetail::write_file(_handle,data.c_str(),data.size());
        boost::interprocess::ipcdetail::close_file(_handle); //关闭,扩容完成
        delete region;
        delete mf;
        getchar();
        mf = new file_mapping(file_name, read_write);
        region = new mapped_region(*mf, read_write);
        addr = region->get_address();
        std::cout << addr << std::endl;
        memset((char*)addr+file_size, 'o', file_size);
        region->flush();
    }
    getchar();
    return 0;
}

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.0.0)

PROJECT(ctest)

SET (MyDeps $ENV{MyDependsGcc})

SET(SUFFIX .so)

MESSAGE(STATUS "MyDepends is at $ENV{MyDependsGcc}")

SET(INCS ${MyDeps}/include)

SET(LNKS ${MyDeps}/lib)

SET(PLATFORM x64)

SET(PREFIX lib)

SET(CMAKE_CXX_STANDARD 17)


 

INCLUDE_DIRECTORIES(${INCS})

LINK_DIRECTORIES(${LNKS})

LIST(APPEND LIBS

    dl

    pthread

    boost_filesystem

)

ADD_EXECUTABLE(boost_mapping_file boost_mapping_file.cpp)

TARGET_LINK_LIBRARIES(boost_mapping_file ${LIBS})

 

第一个getchar()之前,内存占用

第二个getchar()之前,内存占用

 

最后

这篇文章解释不错,可以参考,linux top命令 实存(RES)与虚存(VIRT)详解_top res-CSDN博客

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
共享内存是一种用于多个进程之间进行数据交换的机制。共享内存封装类是为了方便开发者使用共享内存而设计的类。它封装了底层的共享内存操作,提供了一些简洁易用的接口供开发者调用。 在C++中,可以使用第三方库例如Boost库或者Qt库提供的共享内存封装类,也可以自己编写封装类。无论是使用第三方库还是自己编写封装类,共享内存封装类通常会提供以下功能: 1. 创建或打开共享内存:封装类提供了一些方法用于创建或打开已存在的共享内存区域。 2. 写入和读取数据:封装类提供了方法用于往共享内存中写入数据或从共享内存中读取数据。 3. 同步机制:封装类通常提供了一些同步机制,例如互斥锁或条件变量,来确保多个进程之间对共享内存的读写操作是安全的。 一个使用共享内存封装类的实例是_vc内存文件类。_vc内存文件类是属于Qt库中的一部分,用于在不同的进程之间共享数据。它提供了一些方法来创建、打开、写入和读取共享内存中的数据。 使用_vc内存文件类时,首先需要创建一个_vc内存文件对象,然后可以调用其方法来创建或打开已存在的共享内存区域。创建或打开成功后,就可以使用对象的方法来进行数据的写入和读取操作。 例如,可以调用_vc内存文件对象的writeData()方法来写入数据,该方法会将数据写入共享内存中的指定位置;而调用readData()方法可以从共享内存中读取数据。 在使用_vc内存文件类时,还可以利用其提供的同步机制,例如setLock()方法用于设置互斥锁,以确保多个进程之间对共享内存的操作是互斥的,同时可以使用条件变量来进行进程间的通信。 总之,共享内存封装类和_vc内存文件类是用于方便开发者使用共享内存的工具,通过封装底层操作,使得开发者可以更方便地进行数据共享和交换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值