内存映射(1)

news/2024/4/25 9:44:17/文章来源:https://blog.csdn.net/Neo_21/article/details/129138530

内存映射

磁盘文件中的数据映射到内存,用户通过修改内存就能修改磁盘文件

相关的系统调用:

 void *mmap()

功能:将一个文件或设备的数据映射到内存中

参数:

  1.         void *addr : NULL 由内核指定
  2. length : 要映射的数据长度,这个值不能为0,建议使用文件的长度。获取文件的长度,stat,lseek
  3. port : 对申请映射区的操作权限
    1. PORT_EXEC : 可执行的权限
    2. PORT_READ : 读权限
    3. PORT_NONE :没有权限
    4. 要操作映射区必须要有读权限
  4. flags : 
    1. MAP_SHARED : 映射区的数据会自动和磁盘文件进行同步,进程间通信必须要设置这个选项
    2. MAP_PRIVATE : 不同步,内存映射区的数据改变了对原来的文件不会进行修改,会重新创建一个新的文件
  5. fd :需要映射的文件的文件描述符
    1. 通过open得到,open的是一个磁盘文件
    2. 注意:文件的大小不能为0,open指定的权限不能和port参数有冲突
      1. open:只读/读写   port:PORT_READ
      2. open:读写           port : PORT_READ | PORT_WRITE
  6. offset : 偏移量,一般不用
  7. 返回值:返回创建的内存的首地址,失败返回MAP_FAILED,

int munmap()

  1. 功能:释放内存
  2. 参数:
    1. addr :要释放的内存首地址
    2. length :释放的内存大小

 使用内存映射实现进程间通信:

  1. 有关系的·进程(父子进程)
    1. 通过唯一父进程,创建内存映射区
    2. 然后创建子进程
    3. 父子进程共享创建的内存映射区
  2. 没有关系的进程间通信:
    1. 准备一个大小不是0的磁盘文件
    2. 进程1:通过磁盘文件创建内存映射区,得到一个操作这块内存的指针
    3. 进程2:通过磁盘文件创建内存映射区,得到一个操作这块内存的指针
    4. 使用内存映射区进行通信

注意:内存映射区通信,是非阻塞的。

实现

父进程读取到子进程输入的数据

/*
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);int munmap(void *addr, size_t length);
*/
#include<stdio.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<wait.h>
int main(){//打开一个文件int fd = open("test.txt",O_RDWR);//获取文件的大小int size = lseek(fd,0,SEEK_END);//创建内容映射区void *ptr = mmap(NULL,size,PROT_READ | PROT_WRITE, MAP_SHARED, fd , 0);// 返回一个指针if(ptr == MAP_FAILED){perror("mmap");exit(0);}//创建子进程pid_t pid = fork();if (pid > 0){wait(NULL);//父进程char buf[64];strcpy(buf,(char *)ptr);printf("read data : %s\n",buf);}else if(pid == 0){//子进程strcpy((char *)ptr,"nihao!!!!");}//关闭内存映射区munmap(ptr,size);return 0;
}

 

 文件也发生了改变

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72155.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JUC并发编程——进程与线程

目录一、进程和线程的概念1.1 进程1.2 线程1.3 进程与线程对比二、并行和并发的概念三、线程基本应用3.1 多线程应用——异步调用一、进程和线程的概念 1.1 进程 ● 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 …

【Mysql系列】Mysql之ACID实现原理

ACID 原子性 事务不可分割&#xff0c;要么全部执行&#xff0c;要么都不执行。原理是使用undo log。undo log&#xff0c;当事务对数据库进行修改的时候&#xff0c;会生成对应的undo log。 持久性 事务提交后&#xff0c;对于数据库的改变是永久性的。实现原理通过redo l…

超详细解读!数据库表分区技术全攻略

更多内容可以关注微信公众号&#xff1a;老程序员刘飞 分区的定义 分区是一种数据库优化技术&#xff0c;它可以将大表按照一定的规则分成多个小表&#xff0c;从而提高查询和维护的效率。在分区的过程中&#xff0c;数据库会将数据按照分区规则分配到不同的分区中&#xff0…

排序算法-java实现

文章目录冒泡排序选择排序插入排序快速排序希尔排序冒泡排序 原理&#xff1a; 依次比较两个相邻的元素&#xff0c;如果它们顺序错误就把它们交换过来。 时间复杂度&#xff1a; 若文件的初始状态是正序的&#xff0c;一趟扫描即可完成排序。所需的关键字比较次数C和记录移…

graphviz:实现图文件的可视化

1. graphviz下载安装 参考的是这篇文章&#xff1a;https://blog.csdn.net/qq_37085158/article/details/126421102 graphviz的下载地址为&#xff1a;https://graphviz.org/download/ 2. graphviz的使用步骤 将edge文件转化成dot文件WinR&#xff0c;输入cmd&#xff0c;在…

linux rsync服务端安装和windows客户端备份

安装&#xff1a;yum install -y rsync 密码内容&#xff1a;zhangsan:123456 配置文件&#xff1a;/etc/rsyncd.conf内容 # /etc/rsyncd: configuration file for rsync daemon mode # See rsyncd.conf man page for more options. # configuration example: uid root gi…

LVGL Styles

LVGL StylesGet started按钮添加标签按钮添加风格滑动条值显示StylesSize stylesBackground stylesBorder stylesOutline stylesShadow stylesImage stylesArc stylesText stylesLine stylesGet started 按钮添加标签 /*** brief 按钮事件回调函数* param e */ void btn_eve…

网络有线无线配置

一、需求 在无线接入区内&#xff0c;当Lsw1的上联口出现故障时&#xff0c;需要通过AP1-LSw1-LSw2-LSw3的路径访问公网server3。这是因为AP1通过无线网连接到LSw1&#xff0c;而LSw1与LSw3之间的链路出现故障&#xff0c;无法直接访问公网server3。因此&#xff0c;流量需要通…

一文说清WMS系统与MES系统,SRM系统,ERP系统集成的好处

由于制造过程的多样性、复杂性、业务流程的多样性和复杂性&#xff0c;因此&#xff0c;制造企业的信息化系统包括WMS、SRM、MES等管理系统&#xff0c;但它们的管理方向却各不相同&#xff0c;例如WMS这个是管理仓库、 SRM是管理公司的供应商、 MES是管理车间的生产制造的等等…

决策树、随机森林、GBDT、XGBoost

文章目录 1. 引入 1.1 决策树1.2 随机森林1.3 GBDT(Gradient Boosting Decision Tree)梯度提升决策树1.4 XGBoost&#xff08;eXtreme Gradient Boosting&#xff09;极端梯度提升2. 代码实现 2.1 决策树&随机森林&GBDT&XGBoost 2.1.1 分类2.1.2 回归2.1.3 显示模…

SpringCloud(二)配置中心

配置中心Nacos配置中心多环境共享Nacos集群搭建Nacos配置中心 作用&#xff1a; 统一配置管理配置自动刷新&#xff0c;热更新 实现&#xff1a; 统一配置管理 在nacos服务端&#xff0c;配置管理配置列表中新建配置了解配置获取的步骤&#xff1a; 项目启动->读取nacos中…

全开源无加密的RuleApp文章社区APP客户端源码

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 开源无加密的文章社区客户端源码分享 RuleApp文章社区&#xff0c;VIP会员&#xff0c;写作投稿积分商城&#xff0c;付费模块集成&#xff0c;多平台兼容这是一款开源免费&#xff0c;界…

最全es6数组方法

1.arr.push()从后面添加元素,返回值为添加完后的数组的长度 let arr [1,2,3,4,5] console.log(arr.push(5)) // 6 console.log(arr) // [1,2,3,4,5,5]2.arr.pop()从后面删除元素,只能是一个&#xff0c;返回值是删除的元素 let arr [1,2,3,4,5] console.log(arr.pop())//5 …

【Kubernetes 企业项目实战】08、简化 K8s 应用部署工具 Helm V3 入门到企业实战

目录 一、Helm 介绍 1.1 Helm 是什么 1.2 Helm 解决了什么痛点 1.3 Helm 相关组件及概念 1.4 Helm v3 版本变化 1.5 总结 二、安装 Helm 2.1 下载 Helm 2.2 安装 Helm 2.3 配置国内存放 chart 仓库的地址 三、Helm 基本使用 3.1 搜索和下载 Chart 3.2 部署 chart …

Tencent OS下逻辑卷(LVM)创建和扩容

测试环境是一个虚拟机&#xff0c;原配置1个虚拟盘。 创建4个虚拟盘&#xff0c;每盘2G并挂载在虚拟主机上&#xff0c;启动虚拟主机开始测试。 LVM英文是Logical Volume Manager&#xff0c;直接翻译为逻辑卷管理。 这种磁盘管理模式比较灵活&#xff0c;在磁盘空间不足的时…

WSO2通过设定Role来订阅对应的Api

WSO2通过设定Role来订阅对应的Api1. Add Role And User1.0 Add Role1.1 Add User 1.2 Add Mapping2. Upload Api2.1 Upload Three Apis2.2 Inspection3. AwakeningWSO2安装使用的全过程详解: https://blog.csdn.net/weixin_43916074/article/details/127987099. 1. Add Role An…

UnRaid虚拟机安装OpenWrt软路由

文章目录0、前言1、Openwrt虚拟机安装1.1、前提&#xff0c;需要先在UnRaid中开启虚拟机&#xff1a;1.2、下载OpenWrt虚拟机镜像并上传至UnRaid共享文件夹1.3、创建OpenWrt虚拟机2、开启并设置OpenWrt虚拟机2.1、修改OpenWrt管理ip2.2、OpenWrt的上网设置0、前言 最近折腾了很…

产品未出 百度朋友圈“开演”

ChatGPT这股AI龙卷风刮到国内时&#xff0c;人们齐刷刷望向百度&#xff0c;这家在国内对AI投入最高的公司最终出手了&#xff0c;大模型新项目文心一言&#xff08;ERNIE Bot&#xff09;将在3月正式亮相&#xff0c;对标微软投资的ChatGPT。 文心一言产品未出&#xff0c;百…

江南爱窗帘十大品牌 | 窗帘的定做有哪些技巧和注意事项?

人们的家居空间中总是会有各式各样的窗帘存在的&#xff0c;为了使得窗帘的品质更加的过关&#xff0c;人们在选购时&#xff0c;总是会希望可以购买到高品质的。一般情况下&#xff0c;会采用定制这种方法去进行制作。那么&#xff0c;窗帘的定做有哪些注意事项?窗帘定制技巧…

公司技术团队为什么选择使用 YApi 作为 Api 管理平台?

在 2021 年 12 月份的时候我就推荐过一款软件程序员软件推荐&#xff1a;Apifox&#xff0c;当时体验了一下里面的功能确实很实用&#xff0c;但是当时公司有一套自己的 API 管理方案&#xff0c;所有 Apifox 暂时就没在内部使用。 直到最近要使用其他的 API 管理方案的时候才…