由于项目需要,所以学习了一下Linux下内存映射文件的用法,在这里共享一下自己的收获,希望大家提出宝贵意见,进行交流。
简介:
内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件进行映射,就如同将整个文件从磁盘加载到内存。由此可以看出,使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。另外,实际工程中的系统往往需要在多个进程之间共享数据,如果数据量小,处理方法是灵活多变的,如果共享数据容量巨大,那么就需要借助于内存映射文件来进行。实际上,内存映射文件正是解决本地多个进程间数据共享的最有效方法。
在网上找了一些代码,自己加工之后在Linux下编译通过,可以运行实现相应功能。
memmap.h
-
#ifndef MEMMAP_H
-
#define MEMMAP_H
-
#include <stdio.h>
-
-
class MemMap
- {
-
public:
- MemMap();
- ~MemMap();
-
- bool Map(const char* szFileName);
- void UnMap();
-
- const void* GetData() const { return m_pData; }
- size_t GetSize() const { return m_uSize; }
-
-
private:
- void* m_pData;
- size_t m_uSize;
- int m_nFile;
- };
-
#endif
memmap.C
-
#include "memmap.h"
-
#include <unistd.h>
-
#include <fcntl.h>
-
#include <sys/mman.h>
-
-
- MemMap::MemMap() : m_pData(0), m_uSize(0), m_nFile(0)
- {
- }
-
- MemMap::~MemMap()
- {
- UnMap();
- }
-
-
bool MemMap::Map(const char* szFileName)
- {
- UnMap();
- m_nFile = open(szFileName, O_RDONLY);
- if (m_nFile < 0)
- {
- m_nFile = 0;
- return false;
- }
-
- struct stat status;
- fstat(m_nFile, &status);
-
- m_uSize = status.st_size;
- m_pData = mmap(0, m_uSize, PROT_READ, MAP_SHARED, m_nFile, 0);
- if (MAP_FAILED != m_pData) { return true;}
-
- close(m_nFile);
- m_pData = NULL;
- m_nFile = 0;
- m_uSize = 0;
- return false;
- }
-
-
void MemMap::UnMap()
- {
- if(m_pData)
- {
- munmap(m_pData, m_uSize);
- m_pData = NULL;
- }
-
- if(m_nFile)
- {
- close(m_nFile);
- m_nFile = 0;
- }
-
- m_uSize = 0;
- }
memmain.C
-
#include "memmap.h"
-
-
int main()
- {
- const char* szFileName = "1.txt";
- const char* szFileNew = "2.txt";
- MemMap mm;
- bool bFailed = !mm.Map(szFileName);
- if(bFailed) { return -1; }
-
- size_t uFileSize = mm.GetSize();
- const char* pData = (char*)mm.GetData();
- if(uFileSize <=0 || NULL == pData) { return -2; }
-
- FILE* pNewFile = fopen(szFileNew, "w");
- fwrite(pData, sizeof(char), uFileSize, pNewFile);
- fclose(pNewFile);
- pNewFile = NULL;
-
- return 0;
- }
分享到:
相关推荐
Linux下NFS(网络文件系统)的建立与配置方法 Linux操作系统中,Network File System(NFS)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制,通过对网络文件系统的支持,用户可以在本地系统上像...
这个是我在学习Linux的时候做的思维导图笔记,主要是Linux的一些基础知识。免费提供下载,学习分享。...4.进程间通信:管道特点,有名管道和无名管道,以及管道读写特点,共享内存映射,信号等知识。
(更多详情、使用方法,请下载后细读README.md文件) u-dma-buf(用户空间可映射 DMA 缓冲区)\n概述\nu-dma-buf介绍\nu-dma-buf 是一个 Linux 设备驱动程序,它在内核空间中分配连续的内存块作为 DMA 缓冲区,并使...
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 ...
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 ...
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 ...
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章 进程 ...
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章 进程 ...
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章 进程 ...
内存映射 直接I/O传送 异步I/O 第十七章回收页框 页框回收算法 反向映射 PFRA实现 交换 第十八章Ext2和Ext3文件系统 Ext2的一般特征 Ext2磁盘数据结构 Ext2的内存数据结构 创建Ext2文件...
swap,它还可以将它们映射到文件和文件位置,这样,读写内存将对文件中的数据进行读写。不过,在这里,我们只关心 mmap 向进程添加被映射的内存的能力。munmap() 所做的事情与 mmap() 相反。 如您所见,brk() ...
《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...
《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...
内存映射是一种高速的通信方法,但是使用不当时会对系统造成破坏。 Linux内核与用户空间之间的通信机制是非常重要的。开发人员需要了解Linux内核架构的特点,并选择合适的通信方法,以便实现高效、安全的数据传输。...
Linux进程字符串在 Linux 上从进程的映射内存中解析字符串的取证工具用法选择正确的脚本:linuxProcessStrings.py(64 位)或 linuxProcessStrings32bit.py(32 位)。 授予脚本执行权限 (chmod 755 ...
《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...
《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...
《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...