内存映射mmap的几个api及其使用
内存映射 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及其使用的更多相关文章
- 深入理解内存映射mmap
内存映射mmap是Linux内核的一个重要机制,它和虚拟内存管理以及文件IO都有直接的关系,这篇细说一下mmap的一些要点. 修改(2015-11-12):Linux的虚拟内存管理是基于mmap来实现 ...
- [转载]linux内存映射mmap原理分析【转】
转自:http://www.cnblogs.com/wanpengcoder/articles/5306688.html 转自:http://blog.csdn.net/yusiguyuan/arti ...
- 计算机底层知识拾遗(九)深入理解内存映射mmap
内存映射mmap是Linux内核的一个重要机制,它和虚拟内存管理以及文件IO都有直接的关系,这篇细说一下mmap的一些要点. 修改(2015-11-12):Linux的虚拟内存管理是基于mmap来实现 ...
- 内存映射MMAP和DMA【转】
转自:http://blog.csdn.net/zhoudengqing/article/details/41654293 版权声明:本文为博主原创文章,未经博主允许不得转载. 这一章介绍Linux内 ...
- 内存映射mmap
Table of Contents 1. 什么是mmap 2. 使用方法 2.1. mmap构造器的格式 2.2. 例子1 2.3. 例子2 3. 其它 4. 参考资料 什么是mmap 通常在Unix ...
- Linux内存映射(mmap)系列(1)
看到同事的代码中出现了mmap.所以自己私下学习学习,研究研究..... http://www.cnblogs.com/lknlfy/archive/2012/04/27/2473804.html ( ...
- Linux内存映射--mmap函数
Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明: 头文件: < ...
- linux mmap 内存映射【转】
转自:http://blog.csdn.net/xyyangkun/article/details/7830313 [-] mmap vs readwritelseek mmap vs malloc ...
- mmap内存映射
http://blog.csdn.net/kongdefei5000/article/details/70183119 内存映射是个很有用,也很有意思的思想.我们都知道操作系统分为用户态和内核态,用户 ...
随机推荐
- 让Python支持中文注释
在第一行中加入如下行即可,表示文件的编码: #coding=utf-8 或 #coding=gbk
- 【转】iptables 命令介绍
iptables 防火墙可以用于创建过滤(filter)与NAT规则.所有Linux发行版都能使用iptables,因此理解如何配置iptables将会帮助你更有 效地管理Linux防火墙.如果你是第 ...
- iOS-隐藏Navigationbar【导航栏无缝圆滑的隐藏】
1.ViewController .m - (void)viewDidLoad { [super viewDidLoad]; self.title = @"隐藏导航栏"; UIBu ...
- Oracle 修改表操作
如题: --增加列操作: alert table 表名 add 列名 列的类型 eg:alter table EMP1 add pwd varchar2(10); --删除列操作: alert ...
- XBIM 基于 WexBIM 文件在 WebGL 浏览和加载
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- BZOJ 3309: DZY Loves Math [莫比乌斯反演 线性筛]
题意:\(f(n)\)为n的质因子分解中的最大幂指数,求\(\sum_{i=1}^n \sum_{j=1}^m f(gcd(i,j))\) 套路推♂倒 \[ \sum_{D=1}^n \sum_{d| ...
- BZOJ 1226: [SDOI2009]学校食堂Dining [DP 状压]
题意: $n$个人排队打饭,第$i$个人口味$a_i$,能容忍最多身后第$b_i$个人先打饭. 先后两人$i,j$做饭时间为$a_i & a_j - a_i | a_j$ 求最少时间 一开始想 ...
- WebSocket 示例
websocket应运而生 在WebSocket规范提出之前,开发人员若要实现带有即时通信.实时数据.订阅推送等功能的应用实时性较强的功能,经常会使用的解决方法是 Comet. Comet是一种服务器 ...
- PLECS—直流电机系统2
1.模型图 2,计算及仿真 1)计算 2)仿真 n = 1870.1 r/min (wm = 195.833 rad/s) ...
- vmware安装centos7
VMware下安装CentOS7.2 http://www.mamicode.com/info-detail-1455647.html centos7.2配置网络 http://blog.csdn.n ...