linux下mmap的映射。

转载 2011年09月18日 11:47:27

 

Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明:

  • 头文件:
    • <unistd.h>
    • <sys/mman.h>
  • 原型: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offsize);
  • 返回值: 成功则返回映射区起始地址, 失败则返回MAP_FAILED(-1).
  • 参数:
    • addr: 指定映射的起始地址, 通常设为NULL, 由系统指定.
    • length: 将文件的多大长度映射到内存.
    • prot: 映射区的保护方式, 可以是:
      • PROT_EXEC: 映射区可被执行.
      • PROT_READ: 映射区可被读取.
      • PROT_WRITE: 映射区可被写入.
      • PROT_NONE: 映射区不能存取.
    • flags: 映射区的特性, 可以是:
      • MAP_SHARED: 对映射区域的写入数据会复制回文件, 且允许其他映射该文件的进程共享.
      • MAP_PRIVATE: 对映射区域的写入操作会产生一个映射的复制(copy-on-write), 对此区域所做的修改不会写回原文件.
      • 此外还有其他几个flags不很常用, 具体查看linux C函数说明.
    • fd: 由open返回的文件描述符, 代表要映射的文件.
    • offset: 以文件开始处的偏移量, 必须是分页大小的整数倍, 通常为0, 表示从文件头开始映射.

    下面说一下内存映射的步骤:

  • 用open系统调用打开文件, 并返回描述符fd.
  • 用mmap建立内存映射, 并返回映射首地址指针start.
  • 对映射(文件)进行各种操作, 显示(printf), 修改(sprintf).
  • 用munmap(void *start, size_t lenght)关闭内存映射.
  • 用close系统调用关闭文件fd.

注意事项:

在修改映射的文件时, 只能在原长度上修改, 不能增加文件长度, 因为内存是已经分配好的.

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#define SIZE  10
int main()
{
  int fd;
  char *p;
  char buf[6] = "hello";
   
  if ((fd = open("3.txt", O_RDWR )) < 0)
  {
       printf("open error!\n");
  }
  p =(char *) mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED , fd, 0);
  if (p == MAP_FAILED)
  {
   printf("mman error!\n");
   close(fd);
    return -1;
  }
  memcpy(p, buf, 5);
  printf("p=%s\n",p);
  msync((void *)p, SIZE, MS_ASYNC);
  munmap(p,SIZE);
  close(fd);
  return 0;
}
需注意一点:
1、文件必须存在,且大小不能为空。mmap是把文件的内容做映射。通过映射可以修改文件的内容。

Linux的mmap内存映射机制解析

在讲述文件映射的概念时, 不可避免的要牵涉到虚存(SVR 4的VM). 实际上, 文件映射是虚存的中心概念, 文件映射一方面给用户提供了一组措施, 好似用户将文件映射到自己地址空间的某个部分, 使用...
  • zqixiao_09
  • zqixiao_09
  • 2016年04月07日 19:48
  • 7884

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

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

linux内存映射mmap原理分析

一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了。。。下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内...
  • joejames
  • joejames
  • 2014年07月19日 11:07
  • 8333

linux下的内存映射函数mmap详解及示例代码

  • 2012年12月21日 09:31
  • 78KB
  • 下载

linux下mmap内存映射的使用

http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html#main 简介: 共享内存可以说是最有用的进程间通信方式,也...
  • bytxl
  • bytxl
  • 2013年04月10日 17:49
  • 810

linux下的内存映射函数mmap详解及示例代码

linux下的内存映射函数mmap详解及示例代码
  • zhanghy_80
  • zhanghy_80
  • 2011年05月06日 11:55
  • 526

linux下使用mmap映射的内存几时被释放的问题

mmap()是一个非常重要的系统调用,这仅从mmap本身的功能描述上是看不出来的。从字面上看,mmap就是将一个文件映射进进程的虚拟内存地址,之后就可以通过操作内存的方式对文件的内容进行操作,上代码:...
  • dai_peixian
  • dai_peixian
  • 2016年12月15日 15:49
  • 1395

linux下的内存映射函数mmap详解及示例代码

自:http://hi.baidu.com/flying5/blog  不错的博客,大家可以去看看 Linux的mmap文件内存映射机制mmap: memory map在讲述文件映射的概念时, 不...
  • eustoma
  • eustoma
  • 2011年05月28日 07:49
  • 422

linux mmap文件内存映射机制

  • 2011年10月16日 16:30
  • 71KB
  • 下载

Linux -----mmap进行内存映射的原理(未完成)

mmap系统调用的最终目的是将,设备或文件映射到用户进程的虚拟地址空间,实现用户进程对文件的直接读写,这个任务可以分为以下三步: 1.在用户虚拟地址空间中寻找空闲的满足要求的一段连续的虚拟地址空...
  • a2796749
  • a2796749
  • 2016年08月29日 00:22
  • 253
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux下mmap的映射。
举报原因:
原因补充:

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