内存映射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 内存映射是个很有用,也很有意思的思想.我们都知道操作系统分为用户态和内核态,用户 ...
随机推荐
- nginx配置中root与alias的区别
nginx指定文件路径有两种方式root和alias,这两者的用法区别,使用方法总结了下,方便大家在应用过程中,快速响应.root与alias主要区别在于nginx如何解释location后面的uri ...
- [C#][Newtonsoft.Json] Newtonsoft.Json 序列化时的一些其它用法
Newtonsoft.Json 序列化时的一些其它用法 在进行序列化时我们一般会选择使用匿名类型 new { },或者添加一个新类(包含想输出的所有字段).但不可避免的会出现以下情形:如属性值隐藏(敏 ...
- ffmpeg转码使用硬件加速
需求源于手机拍摄的视频,默认参数码率较大,拍摄的文件体积较大,不便于保存和转发.手机默认拍照的720P视频,默认码率达到4M,实际上转成1M就差不多了.FFmpeg默认的转码是使用软件解码,然后软件编 ...
- BZOJ 3729: Gty的游戏 [伪ETT 博弈论]【学习笔记】
题意: 给定一棵有根树,每个节点有一些石子,每次可以将不多于k的石子移动到父节点 修改一个点的石子数,插入一个点,询问某棵子树是否先手必胜 显然是一个阶梯Nim 每次最多取k个,找规律或者观察式子易发 ...
- 【自适应辛普森积分】hdu1724 Ellipse
Ellipse Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 解决xshell评估期已过的问题
问题:时间长没有打开xshell,今天突然打开提示评估期已过,如下图所示: 点击采购会弹出购买的界面,(对于我们这些程序屌怎么会花899购买一款软件)点击取消就会退出. 解决方法: 卸载这个要收费的版 ...
- Google Chrome 圆形进度条
Conmajia © 2012 Updated on Feb. 21, 2018 Google Chrome 的圆形进度条. Demo 功能 显示百分比(0-100).如果进度值达到 100%,则将闪 ...
- php+redis 学习 四 队列
<?php /** * redis实战 * * 利用列表list实现简单队列 * * @example php cache.php */ header('content-type:text/ht ...
- 初涉扫码登录:edusoho实现客户端扫码登录(简版)
一.项目简介及需求 edusoho是一套商业版的在线教育平台,项目本身基于symfony2框架开发,现在有一款自己的APP,要求在不多修改edusoho自身代码的基础上,实现客户端对PC端扫码登录.不 ...
- LVS的DR设置测试
dir: ipvsadm -C 清空之前ipvsadm iptables -t nat -F 防火墙规则清空v rs1,rs2: vi /etc/sysconfig/network-scrip ...