LinuxC/C++编程(9)—映射内存

原创 2016年06月01日 11:14:33
简单来说,映射内存,就是创建硬盘文件到进程地址空间的映射,在进程中读写这段映射内存,可以向硬盘文件中直接同步。
利用这点,映射内存也可以像共享内存一样,用来进行不同进程之间的通信。(但共享内存的效率较高,因为不需要任何复制粘帖操作,而映射内存,所产生的只是内存到硬盘中的一个映射,所以比较节省内存开销,可以创建一个空间很大的映射内存区来满足进程间通信的要求)

内存映射是Linux中一种很有特色的机制,有空再更一下原理,先贴示例代码:

#include <iostream>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/sem.h>
#include <sys/fcntl.h>
#include <string.h>
using namespace std;

int main()
{
	string path = "test";
	int fd;
	if ((fd = open(path.c_str(), O_RDWR | O_CREAT, S_IRWXU)) == -1)
	{
		cerr << "open file fail!" << endl;
		return -1;
	}

	lseek(fd, 100, SEEK_SET);//lseek可以让文件产生“空洞”
	write(fd, "", 1);
	lseek(fd, 0, SEEK_SET);

	char *fileMemory;
	if ((fileMemory = (char*)mmap(0, 100, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0)) == NULL) //创建一个4096字节的映射内存
	{
		cerr << "create mmap fail!" << endl;
		return -1;
	}

	if (close(fd) == -1) //创建映射内存完毕,必须观赏文件描述符
	{
		cerr << "close file fail!" << endl;
		return -1;
	}

	char test[10] = "heiheihei";
	strcpy(fileMemory, test);

	if (munmap(fileMemory, 100) == -1)
	{
		cerr << "munmap fail!" << endl;
		return -1;
	}

	return 0;
}


Linux C++内存映射方式读写文件

内存映射就是将磁盘上的文件映射到系统内存中,对内存的修改可以同步到对磁盘文件的修改。可以对大数据文件处理,并且可以提高文件的读写速度。 1 2 3...
  • abcd1f2
  • abcd1f2
  • 2017年01月16日 16:44
  • 1044

在linux中使用内存映射(mmap)操作文件

在使用内存映射操作文件之前,我们先按照常规的方式来读写文件,这种方式操作如下: 1,打开或创建文件,得到文件描述符, 2,将内存中的数据以一定的格式和顺序写入文件,或者将文件中的数据以一定的格式和顺序...
  • hulele2009
  • hulele2009
  • 2013年11月15日 16:50
  • 9043

内存映射文件详解-----C++实现(即一块内存和一个文件相映射对应)

内存映射文件详解-----C++实现 分类: C++ 先不说内存映射文件(即一块内存和一个文件相映射对应)是什么。贴个代码先,。 [cpp] view ...
  • haiross
  • haiross
  • 2015年07月14日 11:31
  • 14206

C/C++(5)实现大数据文件的内存映射机制

摘要 本文主要讲述大量数据的文件的内存映射机制的实现。 1. 内存映射 内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileM...
  • Canhui_WANG
  • Canhui_WANG
  • 2016年09月26日 14:57
  • 938

C++ 磁盘映射

C++ 执行 cmd 命令使用 system 函数,执行成功,函数返回值为 0,失败返回值为 非零值。 如果磁盘已经映射,再次映射,会抛错,所以,在程序退出之前需要删除磁盘映射。   磁盘映射命...
  • einsdan
  • einsdan
  • 2012年04月10日 15:01
  • 1214

C++采用内存映射方式高效率读写大数据

在有时候,项目的数据量特别大,而且源源不断的到来,这个时候,利用传统的IO文件流写文件势必效率很低跟不上节奏。不妨采用内存映射方式来写文件,达到高效。 我们这里采用mmap这种内存映射方法: 一、mm...
  • oceanperfect
  • oceanperfect
  • 2016年08月12日 16:09
  • 5013

C++Builder实现内存映射

这里内存映射发送端(以后简称:发送端)负责写入数据到共享内存中,内存映射接收端(以后简称:接收端)负责显示写入的数据; 当然也可以打开多个内存映射发送端(这里也可以通过读出按钮显示写入到共享内存的数...
  • kz745460163
  • kz745460163
  • 2015年11月22日 14:33
  • 427

Linux C 文件内存映射

这次再次讨论文件的操作,只是对象换成了大型文件。 之所以讨论大型文件,是因为无论当今的热点“大数据处理”,还是老牌的搜索引擎,都会涉及到大型文件的处理效率。 比如前一张我们生成了50000...
  • superbfly
  • superbfly
  • 2014年04月13日 13:56
  • 6945

《C++高效编程:内存与性能优化》第九章:高效内存管理

  • ywcpig
  • ywcpig
  • 2016年09月14日 21:05
  • 738

LinuxC/C++编程(4)—管道通信

管道是Linux为进程提供的一种通信方式,这里所说的管道只能用于有血缘关系的进程(一般是子进程和父进程之间)。一般用来做进程同步和进程间通信。 Linux中提供的有名管道的建立函数为:int pi...
  • Lyintong
  • Lyintong
  • 2016年05月25日 15:27
  • 200
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LinuxC/C++编程(9)—映射内存
举报原因:
原因补充:

(最多只允许输入30个字)