内存映射 mmap
  内存映射mmap函数的作用是建立一段可以被两个或者多个程度读写的内存段,一个程序对他进行任何修改,对其它程序可见。同样,这个功能可以用在对文件的处理上,mmap函数创建一个指向一个内存区域的指针,该内存区域与可以通过一个打开的文件描述符访问的文件的内容相关联。
一、mmap函数

 #include <sys/mman.h>
void *mmap(void *addr,size_t len,int prot,int flags,int filedes,off_t off);

参数说明:
1、addr:用来请求使用某个特定的内存地址。如果他取0,结果指针就将自动分配(这是推荐的做法)。否则会降低程序的可移植性,
因为不同系统的可用地址范围不一样。

2、len:可以访问的数量,即内存段的大小。
3、prot:用于设置内存段访问的权限
    PROT_READ:允许读该内存段
    PROT_WRITE:允许写该内存段
    PROT_EXEC:允许执行该内存段
    PROT_NONE:不能访问
4、flags:控制程序对内存段的改变所造成的影响
    MAP_PRIVATE:内存段私有,对它的修改值对本进程有效
    MAP_SHARED:把对该内存段的修改保存到磁盘文件中
    MAP_FIXED:该内存段必须位于addr指定的地址处
5、filedes:打开的文件描述符
6、off:用以改变经共享内存段访问的文件中数据的起始偏移值

二、msync函数

 #include <sys/mman.h>
int msync(void *addr,size_t len,int flags);

参数说明:
1、addr:共享内存起始位置
2、len: 映射的文件的长度
3、flags:控制执行修改的方式
    MS_ASYNC 采用异步
    MS_SYNC     采用同步
    MS_INVALIDATE 从文件中读回数据

三、munmap函数—— 释放内存段

 #include <sys/mman.h>
int munmap(void *addr,size_t len);

参数说明:

1、addr:共享内存起始位置
2、len: 映射的文件的长度

API的使用例子:

 #include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h> typedef struct record
{
int data;
char string[];
}RECORD; #define N (100)
int main()
{
RECORD rec,*mapped;
int i,f;
FILE *fp;
fp = fopen("records.dat","w+");//以写的方式打开一个文件
for(i=;i<N;i++)
{
rec.data = i;
sprintf(rec.string,"RECORD-%d",i);
fwrite(&rec,sizeof(RECORD),,fp);//向文件中写一个记录
}
fclose(fp);
/////////////////////////////////////////////////////////// f = open("records.dat",O_RDWR);//以读写的方式打开一个文件描述符
mmaped = (RECORD*)mmap(,N*sizeof(RECORD),PROT_WRITE|PROT_READ,MAP_SHARED,f,);//映射
mmaped[].data = ;//修改第43个记录的整型部分
sprintf(mmaped[].string,"RECORD-%d",mmaped[].data);//修改字符串部分
msync((void*)mmaped,N*sizeof(RECORD),MS_ASYNC);//将修改同步到文件
munmap((void*)mmaped,N*sizeof(RECORD));//释放内存段
close(f);//关闭文件描述符
return ;
}

内存映射mmap的几个api及其使用的更多相关文章

  1. 深入理解内存映射mmap

    内存映射mmap是Linux内核的一个重要机制,它和虚拟内存管理以及文件IO都有直接的关系,这篇细说一下mmap的一些要点. 修改(2015-11-12):Linux的虚拟内存管理是基于mmap来实现 ...

  2. [转载]linux内存映射mmap原理分析【转】

    转自:http://www.cnblogs.com/wanpengcoder/articles/5306688.html 转自:http://blog.csdn.net/yusiguyuan/arti ...

  3. 计算机底层知识拾遗(九)深入理解内存映射mmap

    内存映射mmap是Linux内核的一个重要机制,它和虚拟内存管理以及文件IO都有直接的关系,这篇细说一下mmap的一些要点. 修改(2015-11-12):Linux的虚拟内存管理是基于mmap来实现 ...

  4. 内存映射MMAP和DMA【转】

    转自:http://blog.csdn.net/zhoudengqing/article/details/41654293 版权声明:本文为博主原创文章,未经博主允许不得转载. 这一章介绍Linux内 ...

  5. 内存映射mmap

    Table of Contents 1. 什么是mmap 2. 使用方法 2.1. mmap构造器的格式 2.2. 例子1 2.3. 例子2 3. 其它 4. 参考资料 什么是mmap 通常在Unix ...

  6. Linux内存映射(mmap)系列(1)

    看到同事的代码中出现了mmap.所以自己私下学习学习,研究研究..... http://www.cnblogs.com/lknlfy/archive/2012/04/27/2473804.html ( ...

  7. Linux内存映射--mmap函数

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

  8. linux mmap 内存映射【转】

    转自:http://blog.csdn.net/xyyangkun/article/details/7830313 [-] mmap vs readwritelseek mmap vs malloc ...

  9. mmap内存映射

    http://blog.csdn.net/kongdefei5000/article/details/70183119 内存映射是个很有用,也很有意思的思想.我们都知道操作系统分为用户态和内核态,用户 ...

随机推荐

  1. shell第一篇

    前两天不停的再看内核相关的内容,了解内核的形成.内核的执行流程.内核的作用,结果是舍近求远. 其实我只是想了解一下shell的工作,shell与内核有关,但并不需要我么真正去做什么,至少对于我这样额初 ...

  2. 【Shell脚本学习指南笔记】重定向文件描述符 2>&1

    如: make > results 2>&1 重定向 > results让文件描述符1(标准输出)作为文件results,接下来的重定向2>&1有两个部分.2& ...

  3. @Controller注解

    Spring从2.5版本后开始引入注解,用户可以使用@Controller,@RequestMapping,@RequestParam,@ModelAttribute等类似这样的注解. @Contro ...

  4. VLAN 模式下的 OpenStack 管理 vSphere 集群方案

    本文不合适转载,只用于自我学习. 关于为什么要用OpenStack 管理 vSphere 集群,原因可以有很多,特别是一些传统企业,VMware 的使用还是很普遍的,用 OpenStack 纳管至少会 ...

  5. Python之Django rest_Framework(2)

    实例化: v1 = ["view.xxx.path.Role","view.xxx.path.Group",] 可以循环,循环出来的每一个不能实例化 如果把v1 ...

  6. ABP官方文档翻译 7.1 后台Jobs和Workers

    后台Jobs和Workers 介绍 后台Jobs 关于Job持久化 创建后台Job 在队列中添加一个新Job 默认的后台Job管理器 后台Job存储 配置 禁用Job执行 异常处理 Hangfire集 ...

  7. loadrunner调用jar包方法

    环境 win7(32位)/winXP+loadrunner11+JDK 1.6(一定要配置JAVA环境变量) 1.Eclipse中创建com.medivh包 package com.medivh; p ...

  8. 济南清北学堂游记 Day 5.

    十一月的第一天.算下来在济南已经呆了接近一星期了...... 还剩九天...看着洛谷的倒计时心里直发慌. 也许我不该过多纠结于高级算法,基础也是很重要的. 今天晚上就自由的敲一些板子吧.最后的九天,让 ...

  9. BZOJ 1758: [Wc2010]重建计划 [暂时放弃]

    今天晚上思维比较乱,以后再写写吧#include <iostream> #include <cstdio> #include <cstring> #include ...

  10. BZOJ 3932: [CQOI2015]任务查询系统 [主席树]

    传送门 题意: 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi 调度系统会经常向查询系统询问,第Xi ...