linux进程间通信之共享内存
创始人
2024-04-04 03:13:56
0

目录

一,共享内存原理

二,创建共享内存

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

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...