内存映射(1)

news2025/2/26 6:19:01

内存映射

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

相关的系统调用:

 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.coloradmin.cn/o/361638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

端口扫描介绍

文章目录1、端口的基本概念2、端口的常见分类3、端口扫描原理1、端口的基本概念 “端口” 在计算机网络领域中是个非常重要的概念它是专门为计算机通信而设计的&#xff0c;它不是硬件&#xff0c;不同于计算机中的“插槽”&#xff0c;可以说是个“软端口”端口是由计算机的通…

MacBook Pro 恢复出厂设置

目录1.恢复出厂设置1.1 按Command-R 键1.2 macOS 实用工具1.3 从 macOS 恢复功能的实用工具窗口中选择“磁盘工具”&#xff0c;然后点按“继续”1.4 在“磁盘工具”边栏中选择您的设备或宗卷。1.5 点按“抹掉”按钮或标签页1.6 抹掉OS X HD - 数据 完成1.7 抹掉 OS X HD1.8 查…

核心技术: springboot 启动类加载时方法执行的几种实现方式, bean声明周期, 启动执行顺序

目录 1. 业务场景 -> 1.1 初始化操作 -> 1.2 业务操作 -> 1.3优势 2. 实现方式(多种方式,不同思想) -> 2.1 定时调度任务(常用四种方式 task ) --> 2.1.1 Timer(单线程) --> 2.1.2 scheduledExecutorService(多线程并发执行,线程池) --> 2.1…

SmoothNLP新词发现算法的改进实现

SmoothNLP新词发现算法的改进实现 背景介绍 新词发现也叫未登录词提取&#xff0c;依据 《统计自然语言处理》(宗成庆)&#xff0c;中文分词有98%的错误来自"未登录词"。即便早就火遍大江南北的Bert也不能解决"未登录词"的Encoding问题&#xff0c;便索性…

棋牌类游戏测试用例怎么写?我敢打赌你绝对不知道

目录 一&#xff0e;登陆 二&#xff0e;大厅 三&#xff0e;小游戏 四&#xff0e;银行功能 五&#xff0e;其他按钮 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一&#xff0e;登陆 1&#xff0e…

Redis高可用集群方案

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 @[TOC](文章目录)主从复制哨兵模式(sentinel)Cluster集群在生产过程中,Redis不一定会单独部署。因为一旦redis服务因为某些原因导致无法提供数,那么redis就不可用了。那么实现redis高可用的方式就…

Orin装机

安装目录orin刷机谷歌输入法ROS遇到的问题&#xff1a;1、sudo rosdep init2、rosdep updatelibrealsenserealsense_ros安装librealsense安装realsense_ros总的来说就是&#xff0c;注意librealsense和realsense-ros的版本&#xff0c;对于librealsense&#xff0c;采用源码安装…

企业级分布式应用服务 EDAS

什么是企业级分布式应用服务EDAS企业级分布式应用服务EDAS&#xff08;Enterprise Distributed Application Service&#xff09;是一个应用托管和微服务管理的云原生PaaS平台&#xff0c;提供应用开发、部署、监控、运维等全栈式解决方案&#xff0c;同时支持Spring Cloud和Ap…

gcc/g++、动静态库、make/makefile

目录 gcc/g gcc和g的对比 "一段代码的使命" ●预处理 ●编译 ●汇编 ●链接 ●动/静态链接 make/makefile gcc/g gcc和g的对比 对于c文件而言&#xff0c;使用gcc或者g并没有什么区别。而对于cpp文件&#xff0c;在预处理、编译、汇编这三部分&#xff0c;…

《精通Spring4.x 企业应用开发实战》第1章 Spring概述

目录标题前言一、Spring带给我们什么二、Spring体系结构三、Spring4.0新特性核心容器的增强泛型依赖注入Map依赖注入Lazy延迟依赖注入List注入Conditional 注解CGLIB 代理类增强其他四、Spring 子项目总结前言 汇总&#xff1a;《精通Spring4.x 企业应用开发实战》 一、Spring带…

L2-010 排座位

布置宴席最微妙的事情&#xff0c;就是给前来参宴的各位宾客安排座位。无论如何&#xff0c;总不能把两个死对头排到同一张宴会桌旁&#xff01;这个艰巨任务现在就交给你&#xff0c;对任何一对客人&#xff0c;请编写程序告诉主人他们是否能被安排同席。 输入格式&#xff1…

【LeetCode】剑指 Offer 10- II. 青蛙跳台阶问题 p77 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/ 1. 题目介绍&#xff08;10- II. 青蛙跳台阶问题&#xff09; 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取…

采购评标管理过程是怎样的?有哪些评标标准?

采购活动的评标是检查和比较投标的有组织的过程&#xff0c;以选择最佳报价&#xff0c;努力获得实现企业目标所需的货物、工程和服务。 评标是由一个被称为评标小组的机构负责。这个小组如何称呼&#xff0c;取决于企业的情况。同义词有报价审查小组、投标审查委员会或投标审…

在ONLYOFFICE中借助ChatGPT一键创建招聘启事的内容

大家好&#xff0c;相信和多人都在生活中或工作中看到过招聘启示&#xff0c;或多或少都会有些了解。今天教大家在ONLYOFFICE中怎样通过chetGPT创建一份满意的招聘启示&#xff0c;下面是我用chatgpt制作的一份招聘信息&#xff0c;请大家看一下。 ONLYOFFICE ONLYOFFICE文档是…

从0到1实现单机记账APP原理与细节uniApp内含源码 (一)

单机记账APP演示及源码 具体演示如下面视频所示。免费下载地址&#xff1a;点击进入 预览APP&#xff08;内含开屏广告&#xff09;下载地址&#xff1a;http://8.142.10.182:8888/down/aWHWeGaEQE2W.apk 服务器买的便宜&#xff0c;带宽很小所以下载速度慢&#xff0c;主要还…

mathtype7.0最新版安装下载及使用教程

MathType是一款专业的数学公式编辑器&#xff0c;理科生专用的必备工具&#xff0c;可应用于教育教学、科研机构、工程学、论文写作、期刊排版、编辑理科试卷等领域。2014年11月&#xff0c;Design Science将MathType升级到MathType 6.9版本。在苏州苏杰思网络有限公司与Design…

APP任务模块功能借助php-resque实现业务解耦

先上设计图 说明&#xff1a;任务模块分一次性任务和每日任务&#xff0c;可能还包括男女用户任务区分 处理步骤&#xff1a; 一、同步任务数据库 1.1、任务列表数据库 1.2、完成任务数据库 二、搭建即时消息队列 一、composer require resque/php-resque二、因为服务器red…

数据结构:栈和队列(Leetcode20. 有效的括号+225. 用队列实现栈+232. 用栈实现队列)

目录 一.数据结构--栈 1.栈的基本介绍 2.栈的实现 二.数据结构--队列 1.队列的基本介绍 2.队列的实现 三.栈的运用(Leetcode20. 有效的括号225) 1.问题描述 2.问题分析 题解代码&#xff1a; 四.用两个队列实现栈(225. 用队列实现栈 - 力扣&#xff08;Leetcode&a…

Talk | 清华大学交叉信息研究院助理教授杜韬:利用计算方法探究流固耦合

本期为TechBeat人工智能社区第474期线上Talk&#xff01; 北京时间2月15日(周三)20:00&#xff0c;清华大学交叉信息研究院助理教授——杜韬的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “利用计算方法探究流固耦合”&#xff0c;届时将介绍流固…

Windows10使用-处理IE自动跳转至Edge

文章目录 前言一、调整Edge二、调整Internet选项三、搜索栏的恢复总结前言 微软官方宣布,自2023年2月14日永久停止支持Internet Explorer 11浏览器。后期点击IE 图标将会自动跳转到Edge界面。对于一些网站,可能需要使用IE模式才能正常使用,这时候就需要做相应的调整,才能够…