建站网站免费网站开发技术框架

bicheng/2026/1/21 4:11:48/文章来源:
建站网站免费,网站开发技术框架,优秀的app交互界面设计,创意设计海报写在前面#xff1a; 在进程间通信中#xff0c;有一种方式内存映射。内存映射也是进程间通信的方式之一#xff0c;其效率高#xff0c;可以直接对内存进行操作。本节我们对内存映射进行学习#xff0c;并结合案例进行实践。 1、基本理论 内存映射#xff1a;是将磁盘文… 写在前面         在进程间通信中有一种方式内存映射。内存映射也是进程间通信的方式之一其效率高可以直接对内存进行操作。本节我们对内存映射进行学习并结合案例进行实践。 1、基本理论 内存映射是将磁盘文件中的数据映射到内存用户通过修改内存就能修改磁盘文件。 那通过内存映射如何实现进程之间的通信呢简单来说就是将同一个文件存储映射部分分别映射到不同的进程中两个进程通过改变文件的内容读写内存来实现通信不必再使用read和write函数等系统调用加快文件的读取和写入。 内存映射相关函数 #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);//释放内存映射 1、mmap函数 涉及头文件#include sys/mman.h 函数原型void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset); 功能将一个文件或者设备的数据映射到内存中去 参数  - void *adder:NULL;由内核指定。              -lenth:要映射的内存的长度这个值不能为0建议使用文件的长度                     获取文件的长度stat lseek                  没有达到分页的大小按照分页大小进行所以是分页的整数倍。                  所以一般情况下申请的内存区域大于等于文件的大小。              -prot:对申请的内存区的操作权限                      PROT_EXEC  可执行的权限                      PROT_READ  读的权限                      PROT_WRITE 写的权限                      PROT_NONE  没有权限                   要操作映射内存必须要读的权限-PROT_READ、PROT_READ|PROT_WRITE               -flags                MAP_SHARED映射区的数据会自动和磁盘文件进行同步如果要完成进程间通信必须设置这个选项                MAP_PRIVATE不同步内存映射区的数据改变了对原来的文件不会修改会重新创建一个新的文件。copy on write.                 -fd:                     需要操作的文件描述符通过open得到打开的是一个磁盘文件。                     注意文件的大小不能为0                           open指定的权限不能和prot冲突                           portPROT_READ open只读/读写                           portPROT_READ|PROT_WRITE open读写                           总的来说port的权限要小于open的权限必须要有读的权限。                 -offset偏移量一般不用必须要指定的是4k的整数倍。0表示不偏移。         返回值                 -成功返回创建内存的首地址                 -失败返回MAP_FAILED (void *)-1; 2、munmap函数  涉及头文件#includesys/mman.h 函数原型int munmap(void *addr, size_t length); 功能释放内存映射 参数             void *addr释放的内存的首地址             length:要释放的内存的大小要和mmap函数中的length的值一样。 2、案例一通过内存映射实现父子进程间的通信 实现方案         在没有子进程的时候通过唯一的父进程创建内存映射区         有了内存映射区再创建子进程         父子进程共享内存映射区 实现流程         1、打开一个文件         2、获取文件大小用于mmap函数的参数         3、创建内存映射区fork()之后父子进程共享内存映射区。         4、创建子进程                父进程读取数据子进程发送数据因为子进程发送完成后可以被父进程进行回收避免僵尸进程的产生。 #include stdio.h #include fcntl.h #include sys/types.h #include sys/wait.h #include unistd.h #include sys/mman.h #include string.h #include stdlib.hint main() {//1、打开一个文件int fd open(text.txt,O_RDWR);//2、获取大小int sizelseek(fd,0,SEEK_END);//3、创建内存映射区void *ptr mmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if(ptrMAP_FAILED){perror(mmap);exit(0);}//4、创建子进程pid_t pid fork();if(pid0){wait(NULL);//父进程char buf[64];strcpy(buf,(char *)ptr );printf(read data:%s\n,buf);}else if(pid0){//子进程strcpy((char *)ptr,nihao,sun!!);}//关闭内存映射区munmap(ptr,size);return 0; }运行结果 3、案例二通过内存映射实现没有关系进程之间的通信 实现方案         准备一个大小不为0的磁盘文件         进程1 通过磁盘文件(与进程2的文件相同)创建内存的映射区                   得到一个操作这块内存的指针。         进程2 通过磁盘文件(与进程1的文件相同)创建内存映射区                   得到一个操作这块内存的指针。                   使用内存映射区进行通信。  注意内存映射区通信没有阻塞 进程1写内容 #include stdio.h #include fcntl.h #include sys/types.h #include sys/wait.h #include unistd.h #include sys/mman.h #include string.h #include stdlib.hint main() {// 1、准备一个磁盘文件。// 2、通过磁盘文件创建内存的映射区int fd open(test.txt,O_RDWR);int size lseek(fd,0,SEEK_END);void * prtmmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if( prt MAP_FAILED){perror(mmap);exit(0);}strcpy((char *)prt,sixsixsix);munmap(prt,size);return 0; } 进程2读文件 #include stdio.h #include fcntl.h #include sys/types.h #include sys/wait.h #include unistd.h #include sys/mman.h #include string.h #include stdlib.hint main() {// 1、准备一个磁盘文件。// 2、通过磁盘文件创建内存的映射区int fd open(test.txt,O_RDWR);int size lseek(fd,0,SEEK_END);void * prtmmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if( prt MAP_FAILED){perror(mmap);exit(0);}char buf[64];strcpy(buf,(char *)prt);printf(read data:%s\n,buf);munmap(prt,size);return 0; } 运行结果  4、内存映射的注意事项 1、如果对mmap的返回值ptr做操作,munmap能够成功吗     void * ptr mmap(...)     可以对其进行操作但是不建议因为释放的时候需要把最开始的地址记录下来。 2、如果open时O_RDONLY,mmap时prot参数指定 PROT_READ|PROT_WRITE 会怎么样     错误会返回宏MAP_FAILED     open()权限建议和prot参数保持一致更准确的说open()的权限要大于prot参数的权限 3、如果文件偏移量为1000会怎么样     偏移量必须是4k的整数倍否则 错误会返回宏MAP_FAILED 4、mmap什么情况下会调用失败     -第二个参数length0     -第三个参数prot权限                     -只是指定了写权限                     -prot参数权限为PROT_READ|PROT_WRITE,第5个参数文件描述符fd通过open函数打开时O_RDONLY、O_WRONLY 5、可以open的时候O_CREAT一个新文件来创建映射区。     可以的但是创建的文件的大小如果为0肯定不行     -lseek     -truncate     进行扩展 6、mmap后关闭文件描述符对mmap映射有没有影响     int fdopen(xxx);     mmap(,,,,fd,0);     close(fd);     映射区还存在创建映射区的fd被关闭没有任何影响 7、对ptr进行越界操作会怎么     void *ptrmmap(NULL,100..);     4k     越界操作操作的是非法内存-段错误。 5、使用内存映射实现文件的拷贝 使用内存映射实现文件拷贝的功能 /*     1、对原始的文件进行内存映射     2、创建一个新的文件新文件进行扩展     3、把新文件的数据映射到内存中     4、通过内存拷贝将第一个文件的内存数据拷贝到新的文件内存中     5、释放资源 */ #include stdio.h #include sys/mman.h #include sys/types.h #include sys/stat.h #include fcntl.h #include unistd.h #include string.h #include stdlib.h int main() {// 1、对原始的文件进行内存映射int fd open(english.txt,O_RDWR);if(fd-1){perror(open);exit(0);}//获取原始文件的大小int lenlseek(fd,0,SEEK_END);// 2、创建一个新的文件新文件进行扩展int fd1 open(cpy.txt,O_RDWR|O_CREAT,0664);if(fd1-1){perror(open);exit(0);}//对新创建的文件进行拓展truncate(cpy.txt,len);write(fd, ,1);//3、分别做内存映射void * ptr mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);void * ptr1 mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd1,0);if(ptr MAP_FAILED){perror(mmap);exit(0);}if(ptr1 MAP_FAILED){perror(mmap);exit(0);}//内存拷贝memcmp(ptr1,ptr,len);//释放资源munmap(ptr1,len);munmap(ptr,len);close(fd1);close(fd);return 0; } 运行结果 6、父子进程间匿名内存映射 匿名映射不需要文件实体直接进行内存映射。在父子进程中可以使用匿名映射。没有关系的进程不能进行没有关联了。 void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset); 关键在于port需要用到MAP_ANONYMOUS此参数是匿名映射所需要的。 #define _DEFAULT_SOURCE #include stdio.h #include fcntl.h #include sys/types.h #include sys/wait.h #include unistd.h #include sys/mman.h #include string.h #include stdlib.hint main() {//1、创建匿名内存映射区int len 4096;void *ptr mmap(NULL,len,PROT_READ|PROT_WRITE ,MAP_SHARED | MAP_ANONYMOUS,-1,0);//if(ptrMAP_FAILED){perror(mmap);exit(0);}//2、父子进程通信pid_t pidfork();if(pid0){//父进程strcmp((char*)ptr,hello,world);wait(NULL);}else if(pid0){//子进程sleep(1);printf(%s\n,(char*)ptr);}//释放内存映射区int retmunmap(ptr,len);if(ret-1){perror(munmap);exit(0);}int ret1munmap(ptr,len);if(ret1-1){perror(munmap);exit(0);}} 运行结果 以上便是进程间内存映射的相关知识结合案例进行了分析大家学习后一定要多多练习 创作不易还请多多点赞支持

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

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

相关文章

公司使用威联通nas做网站存储厦门城乡住房建设厅网站首页

北大清华在国内可是著名高校,也是不少学子梦寐以求的院校,当然这也就早就竞争激烈的现状,无论是高考还是攻读MBA。那么在剧烈竞争压力下,我们怎么能提高被名校录取的几率呢,我今天从材料关和面试关为大家做一个详细的解…

企业网站建设的类型wordpress 分类显示文章列表

了解了,如果要深入探讨Lambda表达式转换为委托类型的编译过程,我们需要关注C#编译器如何处理这个转换。这个过程涉及到编译时的类型推断、匿名方法的创建,以及生成对应的委托实例。我们来更详细地分析这个过程: 编译阶段 1. 解…

网站服务器租用售价建设网站的一般过程

Hi,大家好,我叫consul,翻译成中文叫做“领事”,其实我更喜欢叫自己为中介,因为我觉得自己做的事情和房产中介非常像。比如说想要卖房的房东到我这边登记,我将房屋信息登录到我的表格中(服务注册…

微网站解决方案什么是社交电商平台

FTP(File Transfer Protocol)是一个用于在网络上的计算机之间传输文件的协议。它属于网络协议组的应用层,主要用于文件的上传、下载和文件管理操作,是一种比较通用、操作也比较简单的传输方式。不过随着国产化大浪潮的推进&#x…

网站页数php网站开发背景

合宙Air724UG-4G模块AT指令调试接线演示 一、前言 上海合宙Air724UG模块是一款高性能的4G Cat.1通信模组(全网通模块,支持移动、联通、电信,支持短信和网络通信),为开发者提供了丰富的接口和开发方式。 在本文中,将详述调试与集成该模块的关键步骤: (1)从基础硬件配…

泰安商城网站开发设计江西建筑人才网

中国移动云能力中心在2020年中国移动全球合作伙伴大会移动云分论坛上,发布了新型自研软硬融合弹性计算架构——大云磐石服务器。该架构以自主设计的可编程芯片HyperCard和轻量级Hypervisor为核心,将存储、网络虚拟化能力卸载到硬件芯片,彻底突…

网站开发学什么语音天元建设集团有限公司黄岛分公司

来源:《科学进展》概要:一种以神经元为模型的超导计算芯片,能比人脑更高效快速地加工处理信息。一种以神经元为模型的超导计算芯片,能比人脑更高效快速地加工处理信息。近日刊登于《科学进展》的新成果,或许将成为科学…

红酒网站建设策划书运营和营销哪个更好

1.具体步骤 大概五个步骤 添加磁盘磁盘分区格式化分区挂载分区到指定目录设置开机自动挂载 目标将sdb1分区挂载到/data目录 2.添加磁盘 使用lsblk -f命令可以查看当前系统磁盘情况 lsblk -f 可以看到已经有一个磁盘sda,现在我们给虚拟机增加一个磁盘 添加完成后…

郑州网站推广公司案例dw安装免费下载

软件详细设计说明书 1.系统总体设计 2.性能设计 3.系统功能模块详细设计 4.数据库设计 5.接口设计 6.系统出错处理设计 7.系统处理规定 软件全套资料:本文末个人名片直接获取或者进主页。

企业网站icp备案申请济南网站优化分析

https://blog.csdn.net/qq_35488967/article/details/54602752 https://blog.csdn.net/xiaolong361/article/details/89417527

国外网站dns改成什么快帝国cms怎么做音乐网站

只有克服了情感的波动,才能专心致志地追求事业的成功 目录 列表 list命令 lpush lpushx rpush rpushx lrange lpop rpop lindex linsert llen lrem ltrim 阻塞命令 小结 列表 列表相当于 数组或者顺序表。 列表类型是用来存储多个有序的字符串&…

郑州网站推广服务个人介绍html代码简单

前端打包工具之Webpack5 什么是打包工具打包工具的作用常见的打包工具一、Webpack1、什么是[webpack](https://webpack.docschina.org/concepts/)2、webpack本身的功能是有限的3、webpack基本使用:基于本身功能只解析JS资源4、webpack配置4.1、entry(入口…

国际网站空间企业网站优化分为两个方向

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 之前已经讲了如何地图中如何添加大量点到webgl图层优化大量点浏览器页面卡顿的问题。本章介绍补充一下叠加大量图片图标要素到地图的情况下的问题。 二、依赖和使用 "ol": "7.5.2"使用npm安装依…

芜湖哪里做网站wordpress主页最新文章显示

1.1DaemonSet是什么 Deployment部署的副本Pod会分布在各个Node上,每个Node都可能运行好几个副本。DaemonSet的不同之处在于:每个Node上最多只能运行⼀个副本。DaemonSet的典型应用场景有: (1)在集群的每个节点上运⾏存…

建筑网站大图哪个网站有高清图片做ppt

引言 串行外设接口(SPI)是微控制器和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。本文先简要说明SPI接口,然后介绍ADI公司支持SPI的模拟开关与多路转换器,以及它们如何帮助减少系统电路板设计中的数…

免费的网站关键词查询工具简易软件下载

739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;使用单调栈遍历&#xff0c;循环找栈中比栈顶数小的就出栈&#xff0c;并且记录值。比栈顶数大的就入栈&#xff0c;形成单调递增的栈 class Solution { public:vector<int> dailyTemperatures(…

济南手机网站定制价格photoshop手机版安卓

以下是我起草的部门SVN规范里原则的一部分。文件提交时要求必须提交注释&#xff0c;注明相关修改信息&#xff0c;例如bug号、任务描述等。具体内容可采用约定或者设置的形式。你所提交的改变将体现给其他开发者&#xff0c;要明白提交的后果&#xff0c;提交之前要慎重。代码…

专业网站托管的公司aso搜索排名优化

代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主&#xff0c;接实验技术指导1对1 实验要求布置请看http://t.csdnimg.cn/1sh7s 运行模型&#xff0c;测试模型在有 100%…

建网站赚钱吗毕设做网站类型

2023年12月10日&#xff0c;周日上午 如何生成Doxygen 风格的注释 在需要Doxygen 风格注释的函数上方输入 /**&#xff0c;然后按下 Enter 键。Qt Creator 将自动为你生成一个注释模板。 输入&#xff0c;Qt Creator会自动帮你补全Doxygen标签 不得不说&#xff0c;写了Doxyge…

网站维护的基本内容包括哪些国内设计网站公司网站

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…