内存映射 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. 理解js中的作用域,作用域链以及闭包

    作用域变量作用域的类型:全局变量和局部变量全局作用域对于最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的 <script> var outerVar = " ...

  2. oracle如何操作约束

    自我总结,欢迎怕转! 约束的作用不多说了,直接看怎么用吧. 非空约束: 在创建表时设置非空约束: CREATE TABLE table_name( column_name datatype NOT N ...

  3. [TCP/IP]TCP连接的建立和终止

    TCP 是支持全双工通信的传输层协议,为了开发出更好的网络通信应用,清楚了解其中的交互过程是非常必要的. 下面用比较直白的话来描述&理解一下这个过程: TCP 连接建立:三次握手 服务器依次调 ...

  4. 一道python面试题引发的血案

    这里说的是一道阿里校招的面试题:一行代码实现对列表a中的偶数位置的元素进行加3后求和? 今天去面试同样遇到了这个题目,这道题考察的是对python高阶函数map/filter的灵活运用(具体的使用方法 ...

  5. Django中url的生成过程详解

    在前面我们知道,Django启动之前会执行admin.py中的autodiscover()方法. def autodiscover(): autodiscover_modules('admin', r ...

  6. JAX-RS和Jersey

    一:JAX-RS JAX-RS是JAVA EE6 引入的一个新技术. JAX-RS即Java API for RESTful Web Services,是一个Java 编程语言的应用程序接口,支持按照 ...

  7. Redis进阶实践之十 Redis哨兵集群模式

    一.引言             上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...

  8. LeetCode - 520. Detect Capital

    Given a word, you need to judge whether the usage of capitals in it is right or not. We define the u ...

  9. ChineseUtils

    这里获得汉字的拼音使用了pinyin4j这个插件,因为多音字的原因效果并不理想 /** * 获得汉字拼音 * @param name * @return */ @SuppressWarnings(&q ...

  10. MarkDown 编辑数学公式

    1. 参考博客:http://blog.csdn.net/smstong/article/details/44340637 1 数学公式的web解决方案 在网页上显示漂亮的数学公式,是多年来数学工作者 ...