【传输平台】07 共享内存详解及测试案例(本项目进程间的通信手段)

本文详细介绍了Linux系统下共享内存的工作原理、创建与映射过程,并通过示例展示了如何使用共享内存进行进程间通信。强调了共享内存作为最快的IPC方式,其在多个进程中直接访问内存的高效性,同时也指出由于缺乏内置同步机制,需要额外的同步手段。文章还探讨了当多个进程同时使用共享内存时,删除内存空间的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本项目使用共享内存来进行进程间通信。
**划重点:**学习Linux的进程间通信(不局限于进程间通信),我们应该站在Linux内核的角度去看待。
皮毛都不怎么懂,我还需努力。

01 管道/消息队列传递数据与用共享内存传递数据比较

001 用管道/消息队列传递数据
在这里插入图片描述
如上图需要四步:
(1)服务器读文件;
(2)服务器把数据给内核,内核缓存下来;
(3)客户端从内核中取数据;
(4)客户端写文件。

002 用共享内存传递数据
在这里插入图片描述
共享内存
进程像使用自己的堆区,栈区一样使用内核
(1)服务器把文件拷贝到共享内存
(2) 客户端直接从共享内存拿数据
所以共享内存是最快的IPC 进程间通信方式

02 共享内存理论知识

这块不是重点: 直接去linux 使用man指令观看

共享内存:是被多个进程共享的一部分物理内存,共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以理解看到其中的内容。

共享内存实现实现分为两个步骤:
一:创建共享内存,使用shmget函数
二:映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数

创建:
int shmget(key_t key,int size,int shmflg)
key标识共享内存的键值:0/IPC_PRIVATE。当key的取值为IPC_PRIVATE,则函数shmget()将创建一个新的共享内存;如果key的取值为0,而参数shmflg中又设置IPC_PRIVATE这个标志,则同样会创建一块新的共享内存。
返回值:如果成功则返回内存标识符,如果失败则返回-1;

映射:
int shmat(int shmid, char *shmaddr,int flag)
参数:
shmid:shmget函数返回的共享内存存储标识符
flag:决定以后用什么方式来确定映射地址(通常为0)
返回值:
如果成功,则返回共享内存到进程中的地址;如果失败,则返回-1

一个进程不再需要共享内存时,需要把它从进程地址空间中脱离。

03 样例

我们直接上代码:

```cpp
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

#include <sys/ipc.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力做一个code杠精

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值