`
cloudmail
  • 浏览: 268098 次
  • 来自: 广州
社区版块
存档分类
最新评论

Linux下内存映射文件的用法简介

 
阅读更多

由于项目需要,所以学习了一下Linux下内存映射文件的用法,在这里共享一下自己的收获,希望大家提出宝贵意见,进行交流。

简介:

内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件进行映射,就如同将整个文件从磁盘加载到内存。由此可以看出,使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。另外,实际工程中的系统往往需要在多个进程之间共享数据,如果数据量小,处理方法是灵活多变的,如果共享数据容量巨大,那么就需要借助于内存映射文件来进行。实际上,内存映射文件正是解决本地多个进程间数据共享的最有效方法。

在网上找了一些代码,自己加工之后在Linux下编译通过,可以运行实现相应功能。

memmap.h

  1. #ifndef MEMMAP_H   
  2. #define MEMMAP_H   
  3. #include <stdio.h>   
  4.   
  5. class MemMap  
  6. {  
  7. public:  
  8.     MemMap();  
  9.     ~MemMap();  
  10.   
  11.     bool Map(const char* szFileName);  
  12.     void UnMap();  
  13.   
  14.     const    void* GetData() const { return m_pData; }  
  15.     size_t         GetSize() const { return m_uSize; }  
  16.   
  17. private:  
  18.     void*     m_pData;  
  19.     size_t    m_uSize;  
  20.     int       m_nFile;  
  21. };  
  22. #endif  

memmap.C

  1. #include "memmap.h"   
  2. #include <unistd.h>   
  3. #include <fcntl.h>   
  4. #include <sys/mman.h>   
  5.   
  6.   
  7. MemMap::MemMap() : m_pData(0), m_uSize(0), m_nFile(0)  
  8. {  
  9. }  
  10.   
  11. MemMap::~MemMap()  
  12. {  
  13.     UnMap();  
  14. }  
  15.   
  16. bool MemMap::Map(const char* szFileName)  
  17. {  
  18.     UnMap();  
  19.     m_nFile = open(szFileName, O_RDONLY);  
  20.     if (m_nFile < 0)   
  21.     {   
  22.         m_nFile = 0;  
  23.         return false;   
  24.     }  
  25.   
  26.     struct stat status;  
  27.     fstat(m_nFile, &status);  
  28.   
  29.     m_uSize = status.st_size;  
  30.     m_pData = mmap(0, m_uSize, PROT_READ, MAP_SHARED, m_nFile, 0);  
  31.     if (MAP_FAILED != m_pData) { return true;}  
  32.   
  33.     close(m_nFile);  
  34.     m_pData = NULL;  
  35.     m_nFile = 0;  
  36.     m_uSize = 0;  
  37.     return false;  
  38. }  
  39.   
  40. void MemMap::UnMap()  
  41. {  
  42.     if(m_pData)  
  43.     {  
  44.         munmap(m_pData, m_uSize);  
  45.         m_pData = NULL;  
  46.     }  
  47.   
  48.     if(m_nFile)  
  49.     {  
  50.         close(m_nFile);  
  51.         m_nFile = 0;  
  52.     }  
  53.   
  54.     m_uSize = 0;  
  55. }  

memmain.C

  1. #include "memmap.h"   
  2.   
  3. int main()  
  4. {  
  5.     const char* szFileName = "1.txt";  
  6.     const char* szFileNew  = "2.txt";  
  7.     MemMap mm;  
  8.     bool bFailed = !mm.Map(szFileName);  
  9.     if(bFailed) { return -1; }  
  10.   
  11.     size_t uFileSize  = mm.GetSize();  
  12.     const char* pData = (char*)mm.GetData();  
  13.     if(uFileSize <=0 || NULL == pData) { return -2; }  
  14.   
  15.     FILE*  pNewFile  = fopen(szFileNew, "w");  
  16.     fwrite(pData, sizeof(char), uFileSize, pNewFile);  
  17.     fclose(pNewFile);  
  18.     pNewFile = NULL;  
  19.   
  20.     return 0;  

分享到:
评论

相关推荐

    Linux下NFS(网络文件系统)的建立与配置方法.pdf

    Linux下NFS(网络文件系统)的建立与配置方法 Linux操作系统中,Network File System(NFS)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制,通过对网络文件系统的支持,用户可以在本地系统上像...

    Linux的常用命令cat、sed、zip等用法,以及shell编程的基本语法,以及makefile编写方式等等

    这个是我在学习Linux的时候做的思维导图笔记,主要是Linux的一些基础知识。免费提供下载,学习分享。...4.进程间通信:管道特点,有名管道和无名管道,以及管道读写特点,共享内存映射,信号等知识。

    用于Linux的用户空间可映射dma缓冲设备驱动程序。_C_Makefile_下载

    (更多详情、使用方法,请下载后细读README.md文件) u-dma-buf(用户空间可映射 DMA 缓冲区)\n概述\nu-dma-buf介绍\nu-dma-buf 是一个 Linux 设备驱动程序,它在内核空间中分配连续的内存块作为 DMA 缓冲区,并使...

    linux网络编程-宋敬彬-part3

    3.1.1 Linux下文件的内涵 61 3.1.2 文件系统的创建 62 3.1.3 挂接文件系统 64 3.1.4 索引节点inode 65 3.1.5 普通文件 66 3.1.6 设备文件 66 3.1.7 虚拟文件系统VFS 68 3.2 文件的通用操作方法 72 ...

    linux网络编程-宋敬彬-part2

    3.1.1 Linux下文件的内涵 61 3.1.2 文件系统的创建 62 3.1.3 挂接文件系统 64 3.1.4 索引节点inode 65 3.1.5 普通文件 66 3.1.6 设备文件 66 3.1.7 虚拟文件系统VFS 68 3.2 文件的通用操作方法 72 ...

    清华大学Linux操作系统原理与应用

    2.1 内存寻址简介 17 2.1.1 Intel x86 CPU寻址方式的演变 18 2.1.2 IA32寄存器简介 19 2.1.3 物理地址、虚拟地址及线性地址 21 2.2 分段机制 22 2.2.1 地址转换及保护 24 2.2.2 Linux中的段 24 2.3 分页机制 25 ...

    Linux编程从入门到精通

    2.5 内存映射 22 2.6 请求调页 23 2.7 Linux页缓存 24 2.8 页换出和淘汰 25 2.8.1 减少缓冲区和页缓存大小 25 2.8.2 换出System V共享内存页 26 2.8.3 换出和淘汰页 27 2.9 交换缓存 27 2.10 页换入 28 第3章 进程 ...

    LINUX编程白皮书 (全集)

    2.5 内存映射 22 2.6 请求调页 23 2.7 Linux页缓存 24 2.8 页换出和淘汰 25 2.8.1 减少缓冲区和页缓存大小 25 2.8.2 换出System V共享内存页 26 2.8.3 换出和淘汰页 27 2.9 交换缓存 27 2.10 页换入 28 第3章 进程 ...

    linux编程白皮书

    2.5 内存映射 22 2.6 请求调页 23 2.7 Linux页缓存 24 2.8 页换出和淘汰 25 2.8.1 减少缓冲区和页缓存大小 25 2.8.2 换出System V共享内存页 26 2.8.3 换出和淘汰页 27 2.9 交换缓存 27 2.10 页换入 28 第3章 进程 ...

    Understanding the Linux Kernel

     内存映射  直接I/O传送  异步I/O  第十七章回收页框  页框回收算法  反向映射  PFRA实现  交换  第十八章Ext2和Ext3文件系统  Ext2的一般特征  Ext2磁盘数据结构  Ext2的内存数据结构  创建Ext2文件...

    内存管理内存管理内存管理

    swap,它还可以将它们映射到文件和文件位置,这样,读写内存将对文件中的数据进行读写。不过,在这里,我们只关心 mmap 向进程添加被映射的内存的能力。munmap() 所做的事情与 mmap() 相反。 如您所见,brk() ...

    Linux2.6内核标准教程(共计8-- 第1个)

    《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...

    Linux2.6内核标准教程(共计8--第6个)

    《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...

    Linux内核与用户空间通信机制研究.pdf

    内存映射是一种高速的通信方法,但是使用不当时会对系统造成破坏。 Linux内核与用户空间之间的通信机制是非常重要的。开发人员需要了解Linux内核架构的特点,并选择合适的通信方法,以便实现高效、安全的数据传输。...

    LinuxProcessStrings:从进程的映射内存中解析字符串的取证工具

    Linux进程字符串在 Linux 上从进程的映射内存中解析字符串的取证工具用法选择正确的脚本:linuxProcessStrings.py(64 位)或 linuxProcessStrings32bit.py(32 位)。 授予脚本执行权限 (chmod 755 ...

    Linux2.6内核标准教程(共计8--第8个)

    《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...

    Linux2.6内核标准教程(共计8--第3个)

    《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...

    Linux2.6内核标准教程(共计8--第7个)

    《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...

Global site tag (gtag.js) - Google Analytics