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

Linux C\C++编程-建立文件和内存映射

【图书推荐】《Linux C与C++一线开发实践(第2版)》_linux c与c++一线开发实践pdf-CSDN博客

《Linux C与C++一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书

LinuxC\C++编程技术_夏天又到了的博客-CSDN博客

所谓文件和内存映射,就是将普通文件映射到进程地址空间,然后进程就可以像访问普通内存一样对文件进行访问,而不必再进行调用read或write等操作。系统提供了函数mmap将普通文件映射到内存中,该函数声明如下:

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

其中,参数start为映射区的起始地址,通常为NULL(或0),表示由系统自己决定映射到什么地址;length表示映射数据的长度,即文件需要映射到内存中的数据的大小;prot表示映射区保护方式,取下列某个值或者它们的组合:

  • PROT_EXEC:映射区可被执行。
  • PROT_READ:映射区可读取。
  • PROT_WRITE:映射区可写入。
  • PROT_NONE:映射区不可访问。

参数flags用来指定映射对象的类型、映射选项和映射页是否可以共享,它的值可以是一个或者多个位的组合,可选值如下:

  • MAP_FIXED:如果参数start指定了需要映射到的地址,而所指定的地址无法成功建立映射,映射就会失败。通常不推荐使用此设置,而是将start设置为NULL(或0),由系统自动选取映射地址。
  • MAP_SHARED:共享映射区域,映射区域允许其他进程共享,对映射区域写入数据将会写入原来的文件中。
  • MAP_RIVATE:对映射区域进行写入操作时会产生一个映射文件的复制,即写入复制(copy on write),而读操作不会影响此复制。对此映射区的修改不会写回原来的文件,即不会影响原来文件的内容。
  • MAP_ANONYMOUS:建立匿名映射,映射区不与任何文件关联,而且映射区无法与其他进程共享。
  • MA_DENYWRITE:对文件的写入操作将被禁止,不允许直接对文件进行操作。
  • MAP_LOCKED:将映射区锁定,防止页面被交换出内存。

参数flags必须为MAP_SHARED或者MAP_PRIVATE二者之一的类型。MAP_SHARED类型表示多个进程使用的是一个内存映射的副本,任何一个进程都可以对此映射进行修改,其他的进程对其修改是可见的。而 MAP_PRIVATE则是多个进程使用的文件内存映射,在写入操作后,会复制一个副本给修改的进程,多个进程之间的副本是不一致的。

参数fd表示文件描述符,一般由open()函数返回;参数offset表示被映射数据在文件中的起点。

mmap()映射后,让用户程序直接访问设备内存,相较于在用户空间和内核空间互相复制数据,其效率更高,因此在要求高性能的应用中比较常用。mmap映射内存必须是页面大小的整数倍,面向流的设备不能进行mmap,mmap的实现和硬件有关。

下面这个例子显示了把文件映射到内存的方法。

【例4.11】文件与内存映射

(1)打开Visual Studio Code,新建文本文件,输入代码如下:

#include <sys/mman.h> /* for mmap and munmap */  
#include <sys/types.h> /* for open */  
#include <sys/stat.h> /* for open */  
#include <fcntl.h>     /* for open */  
#include <unistd.h>    /* for lseek and write */  
#include <stdio.h>  int main(int argc, char **argv)  
{  int fd;  char *mapped_mem, * p;  int flength = 1024;  void * start_addr = 0;  fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);  flength = lseek(fd, 1, SEEK_END);  write(fd, "\0", 1); /* 在文件最后添加一个空字符,以便下面的printf正常工作 */  lseek(fd, 0, SEEK_SET);  mapped_mem =(char*) mmap(start_addr,flength,PROT_READ,        			// 允许读  MAP_PRIVATE,       			// 不允许其他进程访问此内存区域  fd,0);  /* 使用映射区域 */  printf("%s\n", mapped_mem); /* 为了保证这里工作正常,参数传递的文件名最好是一个文本文件 */  close(fd);  munmap(mapped_mem, flength);  return 0;  
}  

(2)保存代码为test.cpp,上传到Linux,在命令行下编译并运行:

# g++ test.cpp -o test
# ./test myfile.txt 
hello
boy

可以发现,程序把文件中的内容映射到内存后,再把该内存区域打印出来,显示的正是文件中的内容。其中,myfile.txt是自己新建的文本文件。

上面的方法因为用了PROT_READ,所以只能读取文件里的内容,不能修改,如果换成PROT_WRITE,就可以修改文件的内容了;又由于用了MAAP_PRIVATE,因此此进程只能使用此内存区域,若换成MAP_SHARED,则可以被其他进程访问,请看下例。

【例4.12】修改文件的内存映像

(1)打开Visual Studio Code,新建文本文件,输入代码如下:

#include <sys/mman.h> /* for mmap and munmap */  
#include <sys/types.h> /* for open */  
#include <sys/stat.h> /* for open */  
#include <fcntl.h>     /* for open */  
#include <unistd.h>    /* for lseek and write */  
#include <stdio.h>  
#include <string.h> /* for memcpy */  int main(int argc, char **argv)  
{  int fd;  char *mapped_mem, * p;  int flength = 1024;  void * start_addr = 0;  fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);  flength = lseek(fd, 1, SEEK_END);  write(fd, "\0", 1); // 在文件最后添加一个空字符,以便下面的printf正常工作 lseek(fd, 0, SEEK_SET);  start_addr = (void*)0x80000;  mapped_mem = (char*)mmap(start_addr,flength,PROT_READ|PROT_WRITE,        // 允许写入  MAP_SHARED,       // 允许其他进程访问此内存区域  fd,0);  // 使用映射区域printf("%s\n", mapped_mem); // 为了保证这里正常工作,参数传递的文件名最好是一个文本文件  while ((p = strstr(mapped_mem, "hello"))) { // 此处来修改文件内容,hello必须在文件中已经有了memcpy(p, "Linux", 5);  // 我们把hello改为Linuxp += 5;  }  close(fd);  munmap(mapped_mem, flength);  return 0;  
}  

(2)保存代码为test.cpp,上传到Linux,在命令行下编译并运行:

# g++ test.cpp -o test
# ./test myfile.txt 
hello
boy

再次查看myfile.txt,可以发现内容变了:

# cat myfile.txt 
Linux
boy

说明我们修改内存映像成功了。

相关文章:

Linux C\C++编程-建立文件和内存映射

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 Linu…...

行政纠错——pycorrector学习

pycorrector是一个开源中文文本纠错工具&#xff0c;它支持对中文文本进行音似、形似和语法错误的纠正。此工具是使用Python3进行开发的&#xff0c;并整合了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer等多种模型来实现文本纠错功能。pycorrector官方仓库…...

Go的defer原理

Go 的 defer 原理 defer 是 Go 语言中的一个关键字&#xff0c;用于延迟执行一个函数调用。它通常用于处理资源释放、连接关闭等操作&#xff0c;确保这些操作在函数返回之前执行。 1. 什么是 defer&#xff1f; defer 关键字用于延迟执行一个函数调用&#xff0c;直到包含它…...

Windows 下本地 Docker RAGFlow 部署指南

Windows 下本地 Docker RAGFlow 部署指南 环境要求部署步骤1. 克隆代码仓库2. 配置 Docker 镜像加速(可选)3. 修改端口配置(可选)4. 启动服务5. 验证服务状态6. 访问服务7. 登录系统8. 配置模型8.1 使用 Ollama 本地模型8.2 使用在线 API 服务9. 开始使用10. 常见问题处理端…...

专题三_穷举vs暴搜vs深搜vs回溯vs剪枝_全排列

dfs解决 全排列&子集 1.全排列 link:46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 全局变量回溯 code class Solution { public:vector<vector<int>> ans;vector<int> cur;vector<bool> used;vector<vector<int>> permute…...

【IEEE Fellow 主讲报告| EI检索稳定】第五届机器学习与智能系统工程国际学术会议(MLISE 2025)

重要信息 会议时间地点&#xff1a;2025年6月13-15日 中国深圳 会议官网&#xff1a;http://mlise.org EI Compendex/Scopus稳定检索 会议简介 第五届机器学习与智能系统工程国际学术会议将于6月13-15日在中国深圳隆重召开。本次会议旨在搭建一个顶尖的学术交流平台&#xf…...

华为E9000刀箱服务器监控指标解读

美信监控易内置了数千种常见设备监测器&#xff0c;能够监测超过20万项指标。这些指标涵盖了从硬件设备到软件系统&#xff0c;从网络性能到安全状态等各个方面。如下基于美信监控易——IT基础监控模块&#xff0c;对华为E9000刀箱服务器部分监控指标进行解读。 一、华为E9000…...

【LC】2544. 交替数字和

题目描述&#xff1a; 给你一个正整数 n 。n 中的每一位数字都会按下述规则分配一个符号&#xff1a; 最高有效位 上的数字分配到 正 号。剩余每位上数字的符号都与其相邻数字相反。 返回所有数字及其对应符号的和。 示例 1&#xff1a; 输入&#xff1a;n 521 输出&…...

QT QTreeWidget控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…...

欧几里得算法求最小公倍数和最大公约数

一.最大公约数 gcd(a,b)gcd(b,a%b) 递归式,当且仅当b0&#xff0c;易得0和a的公约数为a.(可作为递归的出口) 证明&#xff1a; int gcd(int a, int b) {if (b 0) return a;else return gcd(b, a % b); } 二.最小公倍数 给定整数a b&#xff0c;求a b的最小公倍数 有图可知…...

Selenium配合Cookies实现网页免登录

文章目录 前言1 方案一&#xff1a;使用Chrome用户数据目录2 方案二&#xff1a;手动获取并保存Cookies&#xff0c;后续使用保存的Cookies3 注意事项 前言 在进行使用Selenium进行爬虫、网页自动化操作时&#xff0c;登录往往是一个必须解决的问题&#xff0c;但是Selenium每次…...

DeepSeek R1模型解读与使用

字节在春节前发布了doubao-1.5&#xff0c;它的官方介绍竟然是这样的&#xff1a; 这次发布了四个型号&#xff0c;doubao-1.5-pro-32k, doubao-1.5-pro-256k, doubao-1.5-lite-32k, doubao-1.5-vision-pro-32k&#xff0c;价格全部与上一个版本doubao模型一致&#xff0c;加量…...

Windows电脑不小心点击了关机,关机过程中如何阻止

如果电脑正在关机的过程中&#xff0c;想要阻止关机&#xff0c;可以尝试以下方法&#xff1a; 如果关机过程较慢&#xff0c;可以按下键盘组合键 Win R 打开运行窗口。输入 shutdown -a 后按回车键&#xff0c;这将中断关机操作&#xff08;适用于 Windows 系统&#xff09;…...

CNN-GRU卷积门控循环单元时间序列预测(Matlab完整源码和数据)

CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍CNN-GRU卷积门控循环单元时间序列预测一、引言1.1、研究背景与意义1.2、研究现状1…...

【吉林乡镇界】面图层shp格式arcgis数据乡镇名称和编码wgs84无偏移内容测评

标题中的“吉林省乡镇界面图层shp格式arcgis数据乡镇名称和编码wgs84无偏移”揭示了这是一个地理信息系统&#xff08;GIS&#xff09;相关的数据集&#xff0c;主要用于描绘吉林省的乡镇边界。这个数据集包含了一系列的文件&#xff0c;它们是ArcGIS软件能够识别和处理的Shape…...

fpga学习入门 串口rs232回环

奇偶检验位这里是省略了 做好回环后可以使用上位机做回环测试&#xff0c;top文件写的方式就是将rx&#xff08;fpga端&#xff09;接受到的模块&#xff08;pc端&#xff09;tx发送出去&#xff0c;这两个端口用杜邦线连接&#xff0c;同理模块的rx连接fpga的tx&#xff0c;…...

智启未来,AI筑梦科技新星”------华清远见成都中心2025冬令营圆满结束

2025年1月11日-16日&#xff0c;华清远见成都中心为期6天的“智启未来&#xff0c;AI筑梦科技新星”2025冬令营活动圆满结束。此次活动吸引了众多对人工智能和无人驾驶技术充满热情的学生参与&#xff0c;共同开启了一段点燃科技梦想的精彩旅程。 报道接待 以AI无人驾驶小车为核…...

接上篇基于Alertmanager 配置钉钉告警

Alertmanager 是一个用于处理和管理 Prometheus 警报的开源工具。它负责接收来自 Prometheus 服务器的警报&#xff0c;进行去重、分组、静默、抑制等操作&#xff0c;并通过电子邮件、PagerDuty、Slack 等多种渠道发送通知。 主要功能 去重&#xff1a;合并相同或相似的警报&a…...

DDD - 如何设计支持快速交付的DDD技术中台

文章目录 Pre概述打造快速交付团队烟囱式的开发团队(BAD)大前端技术中台(GOOD) 技术中台的特征简单易用的技术中台建设总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对象的两种设计思路…...

JAVA与数据结构-线性表

目录 一.线性表的概念 二.线性表的关系及分类 三.数组与顺序表 四.链表 1.静态链表(链表的的数组底层实现&#xff09; 2.循环链表 3.双向链表 五.栈 1.栈的概念 2.栈的底层实现 3.共享空间栈 4.逆波兰表达式&#xff08;后缀表达式&#xff09; 5.栈与递归 六.…...

C++|开源日志库log4cpp和glog

文章目录 log4cpp 和 glog对比1. **功能对比**2. **易用性和配置**3. **性能**4. **线程安全**5. **日志输出**6. **功能扩展**7. **适用场景**8. **总结** 其它开源C日志库1. **spdlog**2. **easylogging**3. **Boost.Log**4. **loguru**5. **Poco Logging**6. **Qt Logging (…...

React Context 实现全局组件注册

来源于GPT4o&#xff1a;https://ai.openaicloud.cn/?inVitecodeEJSTWFZMQE 第一步&#xff1a;创建全局组件上下文 (GlobalComponentProvider) 我们将创建一个 React Context 和 Provider&#xff0c;用于存储和提供全局组件。 // src/context/GlobalComponentProvider.tsx…...

基于AutoDL云计算平台+LLaMA-Factory训练平台微调本地大模型

1. 注册与认证 访问AutoDL官网&#xff1a;前往 AutoDL官网。 注册账号&#xff1a;完成注册流程。 实名认证&#xff1a;按照要求完成实名认证&#xff0c;以确保账号的合规性。 2. 选择GPU资源 进入算力市场&#xff1a;在官网首页点击“算力市场”菜单。 挑选GPU&#x…...

strdup 函数

strdup 函数是 C 标准库中的一个函数&#xff0c;用于复制一个字符串。它的全称是 "string duplicate"。这个函数在 <string.h> 头文件中声明。strdup 函数会分配足够的内存来存储源字符串的副本&#xff0c;并将源字符串的内容复制到新分配的内存中。然后返回…...

2.9/Q2,Charls最新文章解读!

文章题目&#xff1a;The causal effect of Internet use on rural middle-aged and older adults depression: A propensity score matching analysis DOI&#xff1a;10.1177/20552076241310041 中文标题&#xff1a;互联网使用对农村中老年人抑郁症的因果影响&#xff1a…...

【未完成】springboot项目实现扫码登录相关逻辑

准备工作 配置redis 引入redis依赖 <dependencies><!-- Spring Data Redis 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><…...

html、js、css实现爱心效果

好的&#xff01;我们可以进一步美化这个爱心效果&#xff0c;增加更多动态和视觉吸引力。以下是改进后的代码&#xff0c;包括以下功能&#xff1a; 1. 背景渐变&#xff1a;添加动态背景渐变效果。 2. 爱心阴影&#xff1a;为爱心添加阴影&#xff0c;使其更具立体感。 3. 随…...

【前端】Hexo 建站指南

文章目录 前言生成站点本地测试部署云端参考 前言 更好的阅读体验&#xff1a;https://blog.dwj601.cn/FrontEnd/Hexo/build-your-own-website-with-hexo/ 笔记记多了&#xff0c;想要分享给同学们一起交流进步&#xff0c;该怎么办&#xff1f;想要搭建一个属于自己的知识库…...

OpenStack基础架构

openstack是一套IaaS云的解决方案&#xff0c;是一个开源的云计算管理平台 每一台物理机上都会有一个nova服务器 虚拟化其实是在nova主机里启用的 COW技术&#xff1a; 这么来看&#xff0c;3个物理机上产生10个虚拟机&#xff0c;所以把服务分散到10个虚拟机上和分散到4个虚拟…...

1905电影网中国地区电影数据分析(一) - 数据采集、清洗与存储

文章目录 前言一、数据采集步骤及python库使用版本1. python库使用版本2. 数据采集步骤 二、数据采集网页分析1. 分析采集的字段和URL1.1 分析要爬取的数据字段1.2 分析每部电影的URL1.2 分析每页的URL 2. 字段元素标签定位 三、数据采集代码实现1. 爬取1905电影网分类信息2. 爬…...