Linux进程间通信-2

news/2024/10/25 9:23:48/

在上一篇博客中,我们提到的进程间通信的四种方式:管道,共享内存,消息队列和信号量,并对管道的内容进行了讲解。本篇博客我们承接上文,接下来的进程间通信内容。

目录

1.共享内存

1.1内容

1.2操作

1.2.1shmget接口

1.2.2shmat接口

1.2.3shmdt接口

1.2.4shmctl接口

1.2.5应用

1.共享内存

1.1内容

共享内存用于多个进程之间的数据共享,是所有进程间通信方式中最快的通信方式。

共享内存的原理也十分简单:开辟一块物理内存,然后多个进程将这一块物理内存都映射到自己的页表之中,通过自己的虚拟地址来访问这块共享内存物理地址中的数据。

对于共享内存而言,进程可以直接对其进行访问。较于管道进程需要将数据拷贝到其中(写入),再由其他进程将数据读取拷贝到自己的内存(读取),少了两次拷贝过程,通信时间大大降低。因此,我们说共享内存是最快的进程间通信方式。

1.2操作

1.2.1shmget接口

int shmget(key_t key, size_t size, int shmflg);

shmget接口的作用便是创建一个共享内存,其中key是共享内存的标识符(名字),size是需要创建的共享内存大小,最好是PAGE_SZIE(4096kb)的整数倍;

shmflg是关键字:IPC_CREAT--如果共享内存不存在则创建,若存在则开;IPC_EXCL--与IPC_CREAT搭配使用,如果共享内存不存在则创建,若存在则报错;mode_flags--共享内存的访问权限0664。

shmget创建成功则返回一个非负整数(操作句柄);失败则返回-1。

1.2.2shmat接口

void* shmat(int shmid, void* addr, int shmflag);

shmat接口的作是将共享内存的地址信息映射到进程中的虚拟地址空间,其中shmid是shmget打开共享内存是时返回到的操作句柄,addr是映射首地址,不过我们一般将其制NULL,让操作系统进行分配,防止人为错误;shmflag:默认为0表示可读可写,SHM_RDONLY表示只读(前提是权限允许)。

shmat映射成功则返回映射的首地址,失败返回(void*)-1。当我们获取到首地址之后,就可以对共享内存中的内容进行操作。

1.2.3shmdt接口

int shmdt(const void* shmaddr);

shmdt接口是解除共享内存和进程之间的映射关系,其中shmaddr是映射首地址,也就是shmat接口的返回值。

shmat接触映射关系成功则返回0;失败则返回-1。

1.2.4shmctl接口

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

shmctl接口是实现对共享内存的控制,一般用于标记共享内存的删除。其中shmid是shmget接口返回的操作操作句柄;cmd是对共享内存进行的操作:IPC_RMID--标记一个共享内存段需要进行删除;buf用于设置或者获取共享内存信息,当cmd是IPC_RMID时被忽略。

值得注意的是,其中RMID叫做标记删除,而不是删除。这是因为如果当多个进程访问同一个共享内存时,如果其中某个进程突然要删除该共享内存,直接对其进行删除很明显会导致其他进程访问错我。

所以我们对该共享内存进行标记,被标记的共享内存不再接受新的映射,直到当前映射连接计数为0时,在对该共享内存进行实际删除。也就是说接口只是进行删除标记,而实际上的上述由操作系统来完成。

1.2.5应用

照例来书写程序来对上述接口的使用和功能进行实践和展示。

先完成向共享内存写入数据:

然后进行向共享内容读取数据:

最后复制终端,一个终端进行向共享内存写入数据,一个终端进行向共享内存读取数据,得到结果如下:

 如此结果很好的展现了共享内存对进程间通信的实现。


http://www.ppmy.cn/news/38504.html

相关文章

动态gif图是什么?如何快速制作动态gif?

动态gif图片是什么?常见的图片格式有jpg、png以及gif格式,而gif格式的图片就是常见的动态图片。Gif动图因为其画面丰富生动在各种社交软件、公众号推文、宣传海报等都能看到它的身影。那么,如何制作gif动图? 一、用什么工具能制作…

简易小工具实现批量打开多个网页

最近有个需求,希望一次性可以打开多个网页,网址自由指定,这个需求的实现非常简单,使用基本的c代码调用system函数即可,都不需要MFC相关的东西。 但是我实测一些工具后发现一个问题,当打开超过大约3个网址的…

Twitter推荐算法总架构和算法说明

Twitter推荐算法总架构: 这个推荐架构的作用是生成在用户首页上显示的推文列表 步骤: 1、从不同的推荐来源中获取最好的推文,这个过程被称为候选来源。 2、使用机器学习模型对每条推文进行排名。 3、应用启发式方法和过滤器,例如…

Python 自动化指南(繁琐工作自动化)第二版:十四、使用谷歌表格

原文:https://automatetheboringstuff.com/2e/chapter14/ 谷歌表格是一个免费的基于网络的电子表格应用,任何拥有 Google 账户或 Gmail 地址的人都可以使用,它已经成为 Excel 的一个有用的、功能丰富的竞争对手。谷歌表格有自己的 API&#x…

游戏实现:俄罗斯方块

目录 前提: 设置HTML结构 创建CSS样式 编写JavaScript代码 响应式设计 添加触摸事件支持 .测试并优化 代码示例 前提: 要在网页上实现一个适用于PC端和移动端的俄罗斯方块游戏,您可以使用HTML、CSS和JavaScript。HTML5的Canvas元素…

java常见锁策略分享(包括cas和synchronized的优化)

前言 锁策略学习思维导图: 1.常见锁策略 ① 乐观锁和悲观锁 ● 它们是根据锁冲突的预测,如果预测锁冲突比较小,那就是乐观锁,反之,就是悲观锁. ● 举个例子:高考前夕,我总觉得高考题会很难,然后拼命做各种科目的题,全副武装的去应对高考,而我妈则觉得高考只是人生的一个阶段而…

【AUTOSAR】【Lin通信】LinIf

目录 一、概述 1.1 架构 1.2 功能 二、限制说明 三、功能说明 3.1 帧传输 3.1.1 帧类型 3.1.2 帧接收 3.1.3 帧发送 3.2 调度 3.3 主函数 3.4 网络管理 3.4.1 节点管理 3.4.2 进入睡眠过程 3.4.3 唤醒过程 3.5 错误分类 3.5.1 开发错误 3.5.2 运行时错误 四…

LTD220次升级 | 房产应用可显示经纪人信息、展示地图与街景、推荐附近房产 • 留言表单可自定义提示语样式

1、房产应用增加所属代理/经纪人显示 2、房产应用新增地图与街景展示 3、房产应用新增附近推荐房产 4、房产应用新增推荐代理/经纪人展示 5、留言表单组件支持提示语样式设置 6、已知问题修复与优化 01 房产应用 1. 租售详情中增加专属代理/经纪人的信息展示 在上一次的功…