牛骨文教育服务平台(让学习变的简单)
博文笔记

Linux C++内存映射方式读写文件

创建时间:2017-01-16 投稿人: 浏览次数:1761

内存映射就是将磁盘上的文件映射到系统内存中,对内存的修改可以同步到对磁盘文件的修改。可以对大数据文件处理,并且可以提高文件的读写速度。


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 #include<stdio.h> #include<stdlib.h> #include<sys/mman.h> #include<unistd.h> #include<fcntl.h> #define NumReconds 100 typedef struct {     int iNum;     char sName[24]; } Recond; int main(void) {                                                                                                                                                                      Recond recond,*mapped;     int i,f;     FILE *fp;                                                                                                                                                                      fp=fopen("recond.dat","w+");     for( i=0; i < NumReconds; i++)     {         recond.iNum = i;         sprintf(recond.sName,"Recond-%d ",i);         fwrite(&recond,sizeof(Recond),1,fp);                                                                                                                                                                           fclose(fp);         //使用传统方式修改文件内容     fp = fopen("recond.dat","r+");     //获得要修改文件的位置         fseek(fp,43*sizeof(recond),SEEK_SET);     fread(&recond,sizeof(recond),1,fp);     recond.iNum = 143;     sprintf(recond.sName,"Recond-%d",recond.iNum);     fwrite(&recond,sizeof(recond),1,fp);     fclose(fp);         //使用内存映射的方式打开文件,修改文件内存     //注意这里是open打开不是fopen!!!!       f = open("recond.dat",O_RDWR);         //获得磁盘文件的内存映射     mapped = (Recond *) mmap(0 , NumReconds * sizeof(Recond) , PROT_READ|PROT_WRITE, MAP_SHARED, f, 0);     mapped[43].iNum = 999;         sprintf(mapped[43].sName,"Recond-%d",mapped[43].iNum);         //将修改同步到磁盘中     msync((void *)mapped,NumReconds*sizeof(recond),MS_ASYNC);         //关闭内存映射     munmap((void *)mapped,NumReconds*sizeof(recond));     close(f);     exit(0); }




void *mmap(void *start, size_t length, int prot, int flags,

int fd, off_t offset);

返回值:
     若映射成功则返回映射区的内存起始地址

参数说明:

start:映射区的开始地址,设置为0时表示由系统决定映射区的起始地址。 length:映射区的长度。//长度单位是 以字节为单位,不足一内存页按一内存页处理 prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起                PROT_EXEC //页内容可以
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。