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




目录
相关文章
|
4天前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
50 34
|
7天前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
38 17
|
16天前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
50 26
|
2月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
121 13
|
3月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
4月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
233 1
|
4月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
4月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
102 1
|
4月前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
57 4
|
4月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
84 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配