博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]mmap详解
阅读量:2439 次
发布时间:2019-05-10

本文共 1477 字,大约阅读时间需要 4 分钟。

转自

 

mmap函数是unix/linux下的系统调用,来看《Unix Network programming》卷二12.2节有详细介绍。
mmap系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。
          mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。mmap并不分配空间, 只是将文件映射到调用进程的地址空间里, 然后你就可以用memcpy等操作写文件, 而不用write()了.写完后用msync()同步一下, 你所写的内容就保存到文件里了. 不过这种方式没办法增加文件的长度, 因为要映射的长度在调用mmap()的时候就决定了.
简单说就是把一个文件的内容在内存里面做一个映像,内存比磁盘快些。
基本上它是把一个档案对应到你的virtual memory 中的一段,并传回一个指针。
以后对这段 memory 做存取时,其实就是对那个档做存取。
它就是一种快速 file I/O 的东东,而且使用上和存取 memory 一样方便,只不过会占掉你的 virutal memory。
#include <sys/types.h>
#include <sys/stat.h> //文件状态结构
#include <unistd.h>
#include <sys/mman.h> //mmap头文件
void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
mmap开启记忆体对映。
start指定记忆体位置,通常都是用NULL。offset指定档案要在那里开始对映,通常都是用0。
int munmap(void *start, size_t length);
int msync(const void *start, size_t length, int flags);
如果开启记忆体对映是希望写入档案中,那麽修改过的记忆体会在一段时间内与档案稍稍有点不同。如果您希望立即将资料写入档案中,可使用msync。
start为记忆体开始位置,length为长度。
flags则有三个:
MS_ASYNC : 请Kernel快将资料写入。
MS_SYNC : 在msync结束返回前,将资料写入。
MS_INVALIDATE : 让核心自行决定是否写入,仅在特殊状况下使用
例子:
if( (fp = open("./data.bin",O_RDONLY) ) < 0 )
{
cout<<" Can not open !"<<endl;
exit(0);
}
if( (fstat(fp,&stat_data) ) < 0 )
{
cout<<" fstat error !";
exit(0);
}
if( ( start_fp = mmap(NULL,stat_data.st_size,
PROT_READ,MAP_SHARED,fd_denseindex,0 )) == (void *)-1)
{
cout<<" mmap error !"<<endl;
exit(0);
}
这样便能从start_fp开始读取数据啦!

转载地址:http://nagmb.baihongyu.com/

你可能感兴趣的文章
坐标曲线的编程实现 (转)
查看>>
MySQL 4.1.0 中文参考手册 --- 6.2 列类型 (转)
查看>>
MySQL 4.1.0 中文参考手册 --- 6.4 数据操纵:SELECT, INSERT, UPDATE, DELETE (转)
查看>>
MySQL 4.1.0 中文参考手册 --- 6.6 基本的 MySQL 用户实用命令 (转)
查看>>
利用weblogic的POOL(连接池)连接数据库 (转)
查看>>
vs.net beta 2中利用DataGrid分页详解 (转)
查看>>
WebLogic的初步研究(2)--结构篇 (转)
查看>>
Process-Display-Process (PDP) pattern (转)
查看>>
基于构件复用的软件方法与COM支持 (转)
查看>>
DELPHI中使用API函数详解 (转)
查看>>
Single Entry Point to EJB Layer (转)
查看>>
InsideJVM(3)--Method area(方法区) (转)
查看>>
RAC警示录-----各位兄弟补充
查看>>
关于oracle的dbconsole
查看>>
不用重新安装PowerBuilder8.0也可以使用 (转)
查看>>
动态改变屏幕设置 (转)
查看>>
避免按 [ENTER] 键产生的“嘀”声 (转)
查看>>
在VC中,让动态创建的ActiveX控件响应Windows消息。 (转)
查看>>
调用API函数得到磁盘上剩余空间的值 (转)
查看>>
Borland 关注Java和.NET之间的裂口 (转)
查看>>