Linux下C编程-----IO/文件操作/内存映射 实现简单记录存储(3)
来源:互联网 发布:数组公式 编辑:程序博客网 时间:2024/05/18 13:07
利用linux下的文件内存映射可以实现进程共享数据,我们可以把一个文件映射到虚拟内存中使多个进程进行共享,
到这里我们大概能想到他能应用到的领域 是很广泛的
主要涉及到 mmap munmap msync 三个函数的应用
下面贴代码
下面一段代码是为文件建立一个简单的记录存储,并且通过内存映射修改文件内容
/*************************************************************************> File Name: memdb.c> Author: > Mail: > Created Time: Fri 13 Feb 2015 03:46:11 AM PST ************************************************************************/#include<stdio.h>#include<sys/mman.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#define RECORD_NUM 100#define DATA_FILE "./db.dat"//定义数据记录typedef struct { int index ; char str[20];}RecordData;int main(){ FILE*pFile ; void*pMap=NULL; int fdFIle; int i; RecordData record,*pMappedRecord; pFile=fopen(DATA_FILE,"w+") ; if(pFile==NULL) { printf("Create File Error\n") ; return 0; } for(i=0;i<RECORD_NUM;i++) { record.index=i ; sprintf(record.str,"Record:%d",i); fwrite((void*)&record,sizeof(record),1,pFile); } fclose(pFile) ; fdFIle =open(DATA_FILE,O_RDWR) ; if(fdFIle==-1) { printf("Open DataFile Error!\n"); return 0 ; } //map file to memory from file offset 0 to end pMap=mmap(NULL,sizeof(RecordData)*RECORD_NUM,PROT_READ|PROT_WRITE,MAP_SHARED,fdFIle,0) ; if(pMap==MAP_FAILED) { printf("Map file to Virtual Memory Error!\n"); close(fdFIle); return 0; } ///get thirty record pMappedRecord=(struct RecordData*)pMap ; printf("%d:%s\n",pMappedRecord[29].index,pMappedRecord[29].str); //modify thirty data sprintf(pMappedRecord[29].str,"%s","Hello,Usher"); //update mapped memory info to file msync(pMap,sizeof(RecordData)*RECORD_NUM,MS_ASYNC); munmap(pMap,sizeof(RecordData)*RECORD_NUM);}
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">我们在另一个进程中可以通过程序查看共享文件内容</span>
</pre><pre code_snippet_id="604510" snippet_file_name="blog_20150213_6_8975773" name="code" class="cpp">/*************************************************************************> File Name: memdb.c> Author: > Mail: > Created Time: Fri 13 Feb 2015 03:46:11 AM PST ************************************************************************/#include<stdio.h>#include<sys/mman.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#define RECORD_NUM 100#define DATA_FILE "./db.dat"//定义数据记录typedef struct { int index ; char str[20];}RecordData;int main(){ int i; void*pMap=NULL; int fdFIle; RecordData record,*pMappedRecord; fdFIle =open(DATA_FILE,O_RDWR) ; if(fdFIle==-1) { printf("Open DataFile Error!\n"); return 0 ; } //map file to memory from file offset 0 to end pMap=mmap(NULL,sizeof(RecordData)*RECORD_NUM,PROT_READ|PROT_WRITE,MAP_SHARED,fdFIle,0) ; if(pMap==MAP_FAILED) { printf("Map file to Virtual Memory Error!\n"); close(fdFIle); return 0; } ///get thirty record pMappedRecord=(struct RecordData*)pMap ; for(i=0;i<RECORD_NUM;i++) printf("%d:%s\n",pMappedRecord[i].index,pMappedRecord[i].str); munmap(pMap,sizeof(RecordData)*RECORD_NUM);}
1 0
- Linux下C编程-----IO/文件操作/内存映射 实现简单记录存储(3)
- linux c 通过内存映射,操作文件
- Linux下C编程-----IO/文件操作 模拟linux ls程序显示文件系统树形结构(2)
- Linux学习记录--文件IO操作相关系统编程
- Linux C编程第七回 - 文件内存映射
- Linux C 文件内存映射
- Linux下C编程入门笔记——文件IO操作(一)
- Linux下C编程入门笔记——文件IO操作(二)
- Linux下C编程入门笔记——文件IO操作
- linux下的文件io编程实现文件的拷贝
- 简单文件操作(Linux下C++实现)
- linux操作系统下c语言编程入门 -- (3)文件操作
- Linux C 文件IO操作
- linux c编程 文件IO
- Linux C程序设计系列之 练习系统调用文件IO、内存映射程序 编写ls程序
- Linux下的C语言编程——文件存储链表实现的通讯录
- Linux C下的内存映射函数
- linux下c编程内存管理及操作方式
- dijkstra最短路径算法的实现
- git常用命令总结
- Android判断设备是否打开WIFI、GPRS数据连接
- C++类型转换
- 简单工厂模式
- Linux下C编程-----IO/文件操作/内存映射 实现简单记录存储(3)
- 查找
- 分支-12. 计算火车运行时间(15)*
- jQuery选择器代码详解(五)——实例说明tokenize的解析过程
- Java同步机制:synchronized,wait,notify
- WEB项目开发的一般流程
- 计算几何_多边形
- java web filter 基础
- jquery插件--ajaxfileupload.js上传文件原理分析