当前位置: 首页 > news >正文

内存映射区

存储映射区介绍

        存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。从缓冲区中取数据,就相当于读文件中的相应字节;将数据写入缓冲区,则会将数据写入文件。这样,就可在不使用read和write函数的情况下,使用地址(指针)完成I/O操作。

        使用存储映射这种方法,首先应通知内核,将一个指定文件映射到存储区域中。这个映射工作可以通过mmap函数来实现。

mmap函数

	函数作用:建立存储映射区函数原型void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);函数返回值:成功:返回创建的映射区首地址;失败:MAP_FAILED宏参数:	addr: 	指定映射的起始地址, 通常设为NULL, 由系统指定length:映射到内存的文件长度prot:	映射区的保护方式, 最常用的:读:PROT_READ写:PROT_WRITE读写:PROT_READ | PROT_WRITEflags:	映射区的特性, 可以是MAP_SHARED: 写入映射区的数据会写回文件, 且允许其他映射该文件的进程共享。MAP_PRIVATE: 对映射区的写入操作会产生一个映射区的复制(copy-on-write), 对此区域所做的修改不会写回原文件。fd:由open返回的文件描述符, 代表要映射的文件。offset:以文件开始处的偏移量, 必须是4k的整数倍, 通常为0, 表示从文件头开始映射。

munmap函数

	函数作用:释放由mmap函数建立的存储映射区函数原型:int munmap(void addr[.length], size_t length);返回值:成功:返回0失败:返回-1,设置errno值函数参数:addr:调用mmap函数成功返回的映射区首地址length:映射区大小(mmap函数的第二个参数)

mmap进程间通信示例:创建write.c、read.c、test.log(里边随便写一些值,不能为空,为空写不进去)

//使用mmap函数完成两个不相干进程间通信 write.c内容:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>int main()
{//使用mmap函数建立共享映射区//void *mmap(void *addr, size_t length, int prot, int flags,//              int fd, off_t offset);int fd = open("./test.log", O_RDWR);if(fd<0){perror("open error");return -1;}int len = lseek(fd, 0, SEEK_END);//建立共享映射区void * addr = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if(addr==MAP_FAILED){perror("mmap error");return -1;}memcpy(addr, "0123456789", 10);return 0;
}

//使用mmap函数完成两个不相干进程间通信 read.c内容:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>int main()
{//使用mmap函数建立共享映射区//void *mmap(void *addr, size_t length, int prot, int flags,//              int fd, off_t offset);int fd = open("./test.log", O_RDWR);if(fd<0){perror("open error");return -1;}int len = lseek(fd, 0, SEEK_END);//建立共享映射区void * addr = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if(addr==MAP_FAILED){perror("mmap error");return -1;}char buf[64];memset(buf, 0x00, sizeof(buf));memcpy(buf, addr, 10);printf("buf=[%s]\n", buf);return 0;
}

编译后运行,test.log先打开随便赋一些内容,先运行write.c编译后的可执行程序,再运行write.c编译后的可执行程序。

相关文章:

内存映射区

存储映射区介绍 存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。从缓冲区中取数据&#xff0c;就相当于读文件中的相应字节&#xff1b;将数据写入缓冲区&#xff0c;则会将数据写入文件。这样&#xff0c;就可在不使用read和write函数的情况…...

es安装拼音分词后Kibana出现内存错误

出现错误 今天在安装es的拼音分词器&#xff0c;并重启es容器后&#xff0c;登录Kibana无法使用&#xff0c;查询日志发现如下报错 Waiting until all Elasticsearch nodes are compatible with Kibana before starting saved objects migrations... | typelog timestamp2024…...

mysql 字符串拼接文本并换行

描述&#xff1a; 拼接字符串文本&#xff0c;文本需要换行 函数&#xff1a; concate&#xff08;‘A串’&#xff0c;char(10),‘B串’&#xff09;&#xff0c;其中char(10)代表换行 案例&#xff1a; select concat(问题一&#xff1a;组织错误,char(10),问题二&#xff1…...

IIC学习总结

一、基本概念 IIC&#xff08;Inter-Integrated Circuit&#xff09;其实是IICBus简称&#xff0c;所以中文应该叫集成电路总线&#xff0c;它是一种串行通信总线&#xff0c;使用多主从架构。 二、模块结构 I2C串行总线一般有两根信号线&#xff0c;一根是双向的数据线SDA&…...

【案例学习】暴力破解攻击(Brute Force Attack)

### 案例与影响 暴力破解攻击在历史上曾导致多次重大安全事件&#xff0c;特别是在用户数据泄露和账户被盗的案例中。随着计算能力的提升和密码管理技术的进步&#xff0c;暴力破解的威胁虽然有所减弱&#xff0c;但仍需警惕&#xff0c;特别是在面对高价值目标时。 【故事一…...

Python学习之基本语法

1.列表用[]&#xff0c;元祖用()&#xff0c;字典用{}&#xff0c;对字典中不存在的键赋值&#xff0c;将进行字典的添加操作 2.Python中&#xff0c;用引号括起的都是字符串&#xff0c;其中的引号可以是单引号&#xff0c;也可以是双引号&#xff0c;这种灵活性使得不用使用…...

QT QDialog::exec()调用时清除部件所有焦点

最近在做项目时&#xff0c;遇到一个问题&#xff1a;在统信UOS系统编写的QT程序&#xff0c;其中进入某些页面时&#xff0c;或者显示模态窗时&#xff0c;按钮都会有一个焦点框&#xff0c;这个是不允许的&#xff0c;于是乎&#xff0c;开始了清理焦点的旅途。 一、清理QDia…...

uni-app @click.stop @click.stop.native均不生效

原因就是用了nvue导致的 vue等其他环境都可以 解决&#xff1a;e.stopPropagation() click"goExecute($event)" goExecute(e) {e.stopPropagation()}, uniApp官方真的是一坨大翔&#xff0c;不仅社区不维护&#xff0c;文档也写的跟粑粑一样&#xff0c;自创的nv…...

数据可视化工具深入学习:Seaborn 与 Plotly 的详细教程

数据可视化工具深入学习&#xff1a;Seaborn 与 Plotly 的详细教程 数据可视化是数据分析中不可或缺的一部分&#xff0c;能够有效地帮助我们理解数据、发现模式和传达信息。在众多可视化工具中&#xff0c;Seaborn 和 Plotly 是两个非常流行且强大的库。本文将深入探讨这两个…...

camera和lidar外参标定

雷达和相机的外参标定&#xff08;外部参数标定&#xff09;指的是确定两者之间的旋转和平移关系&#xff0c;使得它们的坐标系可以对齐。 文章目录 无目标标定livox_camera_calibdirect_visual_lidar_calibration 有目标标定velo2cam_calibration 无目标标定 livox_camera_ca…...

Redis慢查询分析优化

文章目录 一、定义二、慢查询参数配置三、慢查询日志四、排查步骤五、Redis变慢原因 一、定义 在Redis执行时耗时超过某个阈值的命令&#xff0c;称为慢查询。 慢查询日志帮助开发和运维人员定位系统存在的慢操作。慢查询日志就是系统在命令执行前后计算每条命令的执行时间&…...

ETL处理全流程

ETL代表提取Extraction、转换Transform、加载Load——这个过程涉及从各种来源提取数据&#xff0c;将其转换为一致的格式&#xff0c;并将其加载到目标数据库或数据仓库中。这是数据集成和分析的一个重要步骤&#xff0c;因为它确保数据准确、可靠&#xff0c;并准备好进一步处…...

美畅物联丨掌握Wireshark:GB28181协议报文分析实战指南

Wireshark&#xff0c;一款在网络安全与协议分析领域享有盛誉的网络嗅探器&#xff0c;凭借其强大的功能集、直观的图形用户界面以及广泛的跨平台兼容性&#xff0c;已成为众多开发者不可或缺的得力助手。其开源特性吸引了大量开发者的积极参与&#xff0c;不断推动其功能的完善…...

【python】OpenCV—WaterShed Algorithm

文章目录 1、功能描述2、代码实现3、完整代码4、效果展示5、涉及到的库函数5.1、cv2.pyrMeanShiftFiltering5.2、cv2.morphologyEx5.3、cv2.distanceTransform5.4、cv2.normalize5.5、cv2.watershed 6、更多例子7、参考 1、功能描述 基于分水岭算法对图片进行分割 分水岭分割…...

CSS flex布局- 最后一个元素占满剩余可用高度转载

效果图 技术要点 height父元素必须有一个设定的高度flex-grow: 1 flex 盒子模型内的该元素将会占据父容器中剩余的空间F12检查最后一行的元素&#xff0c;高度就已经改变了&#xff1b;...

Camp4-L1:XTuner 微调个人小助手认知

书生浦语大模型实战营第四期-XTuner 微调个人小助手认知 教程链接&#xff1a;https://github.com/InternLM/Tutorial/blob/camp4/docs/L1/XTuner/README.md任务链接&#xff1a;https://github.com/InternLM/Tutorial/blob/camp4/docs/L1/XTuner/task.md提交链接&#xff1a;…...

Qt:语言家视图

1.一不小心将qt语言家点成这样 2.点击查看->视图 3.效果...

【Paper Note】利用Boundary-aware Attention边界感知注意力机制增强部分伪造音频定位

利用Boundary-aware Attention边界感知注意力机制增强部分伪造音频定位 摘要核心模块什么是边界&#xff1f;什么是边界特征&#xff1f; 写作背景解决的问题 方法1. 特征提取使用预训练好的自监督学习模型进行前端特征提取Attentive poolingQ&#xff1a;为什么使用Attentive …...

海外共享奶牛牧场投资源码-理财金融源码-基金源码-共享经济源码

新版海外共享奶牛牧场投资源码/理财金融源码/基金源码/共享经济源码...

iOS静态库(.a)及资源文件的生成与使用详解(OC版本)

引言 iOS静态库&#xff08;.a&#xff09;及资源文件的生成与使用详解&#xff08;Swift版本&#xff09;_xcode 合并 .a文件-CSDN博客 在前面的博客中我们已经介绍了关于iOS静态库的生成步骤以及关于资源文件的处理&#xff0c;在本篇博客中我们将会以Objective-C为基础语言…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...