linux进程间通信之共享内存

news2025/2/21 22:23:07

目录

一,共享内存原理

二,创建共享内存

1,shmget创建共享内存

2,shmat挂接共享内存

3,shmdt取消挂接共享内存

4,shmctl删除共享内存

三,代码使用

1,com.hpp

2,ipc_client.cpp

3,ipc_server.cpp

4,makefile

5,log.hpp

四,实验现象

五,添加管道控制

1,封装几个管道接口

2,客户端

3,服务端

4,实验现象

六,代码链接


一,共享内存原理

还是和上一节一样,俩个进程要通信,那么他俩就需要看到同一块资源,如图所示就是他的原理:
 

所以我们可以知道共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据

二,创建共享内存

四个函数

1,shmget创建共享内存

key需要用户自己提供:

需要用户调用ftok函数来给出:

这里使用和上一节的命名管道差不多,提供相同的路径,和一个int值,生成一个定值key_t,这样俩个进程只要是提供的路径相同,数字相同,就会得到同一个key_t,参考命名管道。

size:创建的大小:

shmflg:创建的方法和权限

IPC_CREAT:没有则创建,有了就返回创建好的。

IPC_EXCL:有了则出错返回,这个不单独使用,和IPC_CREAT,配合,用来保证创建的共享内存是新创建的,而不是以及创建好了。

这个函数的返回值就标定了一块共享内存,并且是唯一标定的。

2,shmat挂接共享内存

shmid:shmget的返回值

shnadder:从哪里挂接,我们一般不知道因该是特殊用途,设置为nullptr就好了,系统自动选择。

shmflag:传0使用默认读写就行了,

shmat的返回值是void* ,参考malloc开出的空间,差不多一样,就当malloc开出的空间那样使用就好了。

3,shmdt取消挂接共享内存

shmat的返回值传入就取消了。

4,shmctl删除共享内存

这里我们主要看删除,是因为共享内存的生命周期不是随进程的,而是随内核的。

第一个参数传shmget返回值,

第二个传IPC_RMID,

第三个是为了设置共享内存信息IPC_SET,或者IPC_STAT输出型参数带回共享内存的信息,用的时候在看文档把。

三,代码使用

 整体代码文件有七个,其实主要就三个

makfile是编译代码的

log.hpp搞日志的,为了方便,可以不搞得,

com.hpp头文件

ipc_client:客户端,也就是进程1

ipc_server:服务端,也就是进程2

剩下俩个是生成得可执行程序

1,com.hpp

2,ipc_client.cpp

3,ipc_server.cpp

4,makefile

 

5,log.hpp

无所谓得这个:

四,实验现象

我们也是发现了,共享内存是没有同步互斥机制得,我们想要同步互斥机制得话可以配合命名管道来使用。

我们关掉进程:发现共享内存没有释放,验证了他是随内核得。

ipccrm -m shmid;手动删除,就没有了

五,添加管道控制

共享内存是没有同步互斥机制得,我们加入一个命名管道来通知他的读取,让他不是随便想读就读。而是在我们写完一句话再去读取,没写完就让他等在那里。

1,封装几个管道接口

管道不会得,前面有讲过哦。

2,客户端

客户端开始时打开管道。

写完之后唤醒

3,服务端

开始时创建管道并打开

在读取得时候按照管道得读取来进行等待

4,实验现象

这就好了,呀就不会随意得读取了,而是和管道同步起来。 

 

六,代码链接

lyh_linux-test: linux代码练习。 - Gitee.com

lyh_linux-test: linux代码练习。 - Gitee.com

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

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

相关文章

Allegro基本规则设置指导书之Physical Region

Allegro基本规则设置指导书之Physical Region 下面介绍基本规则设置指导书之Physical Region 空白的地方创建一个Region 给新建的Region匹配一个规则,所有区域里面的Physical相关的都按照Region的规则来 当部分网络想按照本身的规则来匹配,可以创建region-Class 然后匹配…

目标检测算法——医学图像开源数据集汇总(附下载链接)

关注”PandaCVer“公众号 深度学习Tricks,第一时间送达 目录 1.血细胞图像数据 2.眼病深度学习数据集 3.皮肤病数据集 4.膝关节 X 射线图像数据集 小海带整理不易,小伙伴们记得一键三连喔!!! >>>一起交流…

VisualSVN 是 Visual Studio 的专业级 Subversion 集成插件

用于 Visual Studio 的 VisualSVN 专业且无缝的 Subversion 集成。 专业级 Subversion 集成 VisualSVN 是 Visual Studio 的专业级 Subversion 集成插件。 VisualSVN 的主要优点是: 无与伦比的可靠性: Visual Studio 永远不会因为 VisualSVN 而崩溃或挂…

保护鲸鱼动物网页设计作业 静态HTML宠物主题网页作业 DW鲸鱼网站模板下载 大学生简单动物网页作品代码 个人网页制作 学生个人网页

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

2022阿里云栖大会,顶尖科技趋势峰会和全链路元宇宙体验

2022年的11月3日-5日是阿里巴巴云栖大会的日子,地点在云栖小镇,本人有幸报名参加了5日那场,因为5日是周六。秉着打工人工作日需要搬砖,因为“公司离不开我”,哈哈哈,实际上是每天满满的工作量。所以只能选择…

一文彻底搞懂协程(coroutine)是什么,值得收藏

什么是协程 我们可以简单的认为:协程就是用户态的线程,但是上下文切换的时机是靠调用方(写代码的开发人员)自身去控制的。 同时,协程和用户态线程非常接近,用户态线程之间的切换不需要陷入内核&#xff0…

NYIST(计科ACMTC)第三次招新赛题解

A题 原文, 原比赛B题 牛客练习赛104【出题人题解】 - 知乎 直接输出 输入的数 就可以了 B题 C题 找到分别处理"无留陀的化身"坐标轴的x轴和y轴, 组合成无留陀的坐标, 再遍历求纳西妲的坐标, 相减即可 /* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿…

ROS小工具学习与使用

ROS小工具学习与使用 rqt的使用 rqt_bag工具 rqt_bag <your bagfile> #使用rqt_bag查看你的rosbag例如&#xff1a;可以查看第一帧GPS的rawdata信息&#xff0c;如下图&#xff1a; 参考文献&#xff1a; 1、http://wiki.ros.org/rqt_bag 2、rosbag与rqt_bag的常用 rq…

Nacos学习笔记

视频学习指路&#xff1a; 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 Nacos nacos注册中心的搭建 1.下载nacos的安装包&#xff0c;github地址&#xff1a;https://github.com/alibaba/nacos&…

Tkinter保姆级教程(上)

目录 什么是GUI Tkinter用法详解 第一个Tkinter程序 常用控件和属性 主窗口 Label标签控件 Button按钮控件 Entry输入控件 基本属性 Text 文本控件 列表框(ListBox)和组合框(Combobox) 单选框(Radiobutton)和多选框按钮(Checkbutton) 什么是GUI 图形用户界面&#x…

运算放大器正反馈负反馈判别法

---------------------------------------------------------------------------------------------------------------- 反馈可分为负反馈和正反馈。前者使输出起到与输入相反的作用&#xff0c;使系统输出与系统目标的误差减小&#xff0c;系统趋于稳定&#xff1b;后者使输出…

java面向对象(上)

一、java面向对象学习的三条主线1.java类以及类的成员&#xff1a;属性、方法、构造器&#xff1b;代码块、内部类。2.面向对象的三大特征&#xff1a;封装性&#xff0c;继承性&#xff0c;多态性&#xff0c;&#xff08;抽象性&#xff09;。3.其他关键字&#xff1a;this&a…

.net技术第一章

文章目录.NETC# (C Sharp)的特点C# 的应用范围.NET Framework1.2 创建简单的C#程序结构和书写规则类型的声明和使用类型的声明和使用命名空间使用方法命名空间举例注释Main方法命令行参数Main返回值控制台输入和输出例子格式化.NET 由微软公司提供的免费、跨平台的开源通用开发…

复杂分数 马蹄集

复杂分数 难度&#xff1a;白银 0时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 编写程序连续输入a1、a2、、a5,计算下列表达式的值并输出。本题不考虑输 入0&#xff0c;负数或者其他特殊情况。 1十1中 al 3 4 格式 输入格式&#xff1a;输入整型&#xff0c;空格分隔。…

Go语言学习(二) 函数

文章目录函数go函数基本语法go不支持重载go中支持可变参数函数 go函数基本语法 先来看看go中函数的基本使用 package mainimport "fmt"/* func 函数名(形参列表) (返回值类型列表) {执行语句..return 返回值列表 } */ //自定义函数&#xff1a;功能&#xff1a;两…

实验三:多种影响因素下购房方案的比较

根据呼文军[1]等建立的购房决策数学模型式(1)[1]&#xff0c;通过对影响购房的多个因素进行科学地分析、比较&#xff0c;从若干备选购房方案中做出最佳的选择。 QP*WT &#xff08;1&#xff09; 在文章的“实例分析”中&#xff0c;假设…

Kubeadm搭建kubernetes(k8s)集群

目录 一、集群介绍 1、集群搭建方法 二、集群部署 环境配置 所有节点&#xff0c;关闭防火墙规则&#xff0c;关闭selinux&#xff0c;关闭swap交换 node02&#xff08;192.168.137.30&#xff09; node01&#xff08;192.168.137.20&#xff09; ​编辑 master&#…

单链表经典例题

LeetCode题解移除链表元素反转链表合并两个有序链表移除链表元素 题目描述&#xff1a; ➡️挑战链接⬅️、 分析&#xff1a; 该题是要求我们删除指定元素&#xff0c;那么我们就定义一个cur指针去遍历整个链表就好了&#xff0c;每当我们遇到cur->valval;等于特定值的时…

【PTA-训练day3】L2-014 列车调度 + L1-009 N个数求和

目录 L2-014 列车调度 - 二分贪心 1、java版 - 运行超时 2、c版 L1-010 比较大小 - 10 L1-015 跟奥巴马一起画方块 - 15 L1-009 N个数求和 - 20 java 欧几里得求最大公约数gcd L2-014 列车调度 - 二分贪心 PTA | 程序设计类实验辅助教学平台 如果当前序号比火车队列末…

最流行的 6 款 Python 解释器

有人说&#xff1a;一个人从1岁活到80岁很平凡&#xff0c;但如果从80岁倒着活&#xff0c;那么一半以上的人都可能不凡。 生活没有捷径&#xff0c;我们踩过的坑都成为了生活的经验&#xff0c;这些经验越早知道&#xff0c;你要走的弯路就会越少。 Python 是最流行的编程语言…