Linux下C编程-----IO/文件操作/内存映射 实现简单记录存储(3)

简介: 利用linux下的文件内存映射可以实现进程共享数据,我们可以把一个文件映射到虚拟内存中使多个进程进行共享, 到这里我们大概能想到他能应用到的领域 是很广泛的  主要涉及到 mmap  munmap   msync 三个函数的应用 下面贴代码  下面一段代码是为文件建立一个简单的记...

利用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);
}




目录
相关文章
|
8月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
2728 0
|
8月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
872 0
|
8月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
1037 0
|
9月前
|
Linux C语言 网络架构
Linux的基础IO内容补充-FILE
而当我们将运行结果重定向到log.txt文件时,数据的刷新策略就变为了全缓冲,此时我们使用printf和fwrite函数打印的数据都打印到了C语言自带的缓冲区当中,之后当我们使用fork函数创建子进程时,由于进程间具有独立性,而之后当父进程或是子进程对要刷新缓冲区内容时,本质就是对父子进程共享的数据进行了修改,此时就需要对数据进行写时拷贝,至此缓冲区当中的数据就变成了两份,一份父进程的,一份子进程的,所以重定向到log.txt文件当中printf和fwrite函数打印的数据就有两份。此时我们就可以知道,
208 0
|
9月前
|
存储 Linux Shell
Linux的基础IO
那么,这里我们温习一下操作系统的概念我们在Linux平台下运行C代码时,C库函数就是对Linux系统调用接口进行的封装,在Windows平台下运行C代码时,C库函数就是对Windows系统调用接口进行的封装,这样做使得语言有了跨平台性,也方便进行二次开发。这就是因为在根本上操作系统确实像银行一样,并不完全信任用户程序,因为直接开放底层资源(如内存、磁盘、硬件访问权限)给用户程序会带来巨大的风险。所以就向银行一样他的服务是由工作人员隔着一层玻璃,然后对顾客进行服务的。
130 0
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
575 34
|
机器学习/深度学习 API Python
Python 高级编程与实战:深入理解网络编程与异步IO
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧、数据科学、机器学习、Web 开发和 API 设计。本文将深入探讨 Python 在网络编程和异步IO中的应用,并通过实战项目帮助你掌握这些技术。
|
Linux API C语言
Linux基础IO
Linux基础IO操作是系统管理和开发的基本技能。通过掌握文件描述符、重定向与管道、性能分析工具、文件系统操作以及网络IO命令等内容,可以更高效地进行系统操作和脚本编写。希望本文提供的知识和示例能帮助读者更深入地理解和运用Linux IO操作。
285 14