Linux多进程通信(3)——详细说说共享内存原理及使用例程

1.共享内存原理及优缺点

共享内存的原理便是将相同的一片物理内存映射到进程A和进程B不同的逻辑地址空间,两个进程同时访问这块物理内存(共享内存)。

1)优点
共享内存是进程间通信访问速度最快。
例如消息队列,FIFO,管道的消息传递方式一般为
1:服务器得到输入
2:通过管道,消息队列写入数据,通常需要从进程拷贝到内核。
3:客户从内核拷贝到进程
4:然后再从进程中拷贝到输出文件
上述过程通常要经过4次拷贝,才能完成文件的传递。
共享内存只需要两次拷贝
1:从输入文件到共享内存区
2:从共享内存区输出到文件
上述过程减少了数据不必要的拷贝,以及用户态和内核态之间的切换,所以花的时间较少,和访问进程独有的内存区域一样快

2)缺点
共享内存是进程间不安全的,需要使用额外的同步进制来控制对共享内存的访问,常用的是信号量。

2.查看系统共享内存

ipcs -m    //查看系统的共享内存
ipcrm -m [shmid] //删除指定共享内存段

image.png

3.函数API

1)获取共享内存

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

key:ftok生成的key标识,在系统中是唯一的
size:共享内存大小(系统申请内存的最小单位是页,一页是4K字节,为了避免大量的碎片,申请内存大小一般是页的整数倍),为0代表只是获取已经创建好的共享内存
shmflag:和信号量等相同,IPC_CREAT | IPC_EXCL则代表不存在则创建,存在则返回失败,0代表获取共享内存标识符,若不存在则函数会报错。

2)映射共享内存

 void *shmat(int shmid, const void *shmaddr, int shmflg);

shmid: 共享内存ID
shmaddr: 起始虚拟地址空间,NULL则是由系统自动分配
shmflag:一般为0,可以给SHM_RDONLY为只读模式,其他的为读写
返回值:成功返回虚拟地址,出错返回-1
fork后子进程继承已连接的共享内存地址。exec后该子进程与已连接的共享内存地址自动断开映射。进程结束后,连接的共享内存也会断开映射。

必须所有映射到共享内存的进程都断开映射,才会删除这片共享内存!

3)断开共享内存映射

int shmdt(const void *shmaddr);

shmdt: 断开共享内存映射(断开不代表删除共享内存,只是断开映射的线路)
shmaddr:共享内存地址

4)控制共享内存

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

shmid: 共享内存ID
cmd:执行的具体操作
IPC_RMID:表示可以删除共享内存
IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中
IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内
buf:共享内存管理的结构体
必须所有映射到共享内存的进程都断开映射,才会删除这片共享内存!

4.例程

1)write端代码

#include "apue.h"
#include <sys/ipc.h>
#include <sys/shm.h>
//write hello world 
//another program read this msgint main(int argc, char **argv)
{//1.根据文件和id获取keykey_t key;key = ftok(".", 2);//2.根据key创建共享存储区int shmid = 0;shmid = shmget(key, 1024, IPC_CREAT|IPC_EXCL|0666);if (shmid == -1) {perror("shmget error");return -1;}//3.连接共享存储区和进程地址空间char *shmaddr = NULL;shmaddr = shmat(shmid, 0, 0);if (shmaddr == (char *)-1) {perror("shmat error");return -1;}//4.写入数据strcpy(shmaddr, "hello world");sleep(5);//5. 断开共享存储连接shmdt(shmaddr);//6. 删除共享存储区shmctl(shmid, IPC_RMID, NULL);printf("success write!!\n");return 0;
}

2)read端代码

#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
//write hello world 
//another program read this msgint main(int argc, char **argv)
{//1.根据文件和id获取keykey_t key;key = ftok(".", 2);//2.根据key创建共享存储区int shmid = 0;shmid = shmget(key, 0, 0);if (shmid == -1) {perror("shmget error");return -1;}//3.连接共享存储区和进程地址空间char *shmaddr = NULL;shmaddr = shmat(shmid, 0, 0);if (shmaddr == (char *)-1) {perror("shmat error");return -1;}printf("read data is %s \n", shmaddr);//5. 断开共享存储连接shmdt(shmaddr);printf("success read!!\n");return 0;
}

gcc编译后测试效果如下~,当然这只是一个简单的demo,正常我们使用的话,一定要用信号量等手段,进行共享内存的保护

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

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

相关文章

Google Chrome将某个页签静音,不是网站

Google Chrome将某个页签静音&#xff0c;不是网站 打开chrome://flags/在里面搜索&#xff0c;audio&#xff0c;找到Tab audio muting UI contorl的选项&#xff0c;右侧设置为Enable。重新启动浏览器。 发现有声音的浏览器页签有一个喇叭图标&#xff0c;点击一下就行了。

Linux中间件(nginx搭建、LNMP服务搭建)

目录 一、安装nginx 第一步、下载nginx的压缩包到Linux中 ​第二步、安装依赖 第三步&#xff1a;安装 nginx 第四步&#xff1a;启动nginx 第五步&#xff1a;测试nginx 二、 nginx的配置文件 nginx.conf文件内容解读 案例&#xff1a;发布多个网站 二、lamp/lnmp …

独孤思维:自己瞎琢磨副业,根本赚不到钱

01 有人说&#xff0c;干嘛付费学副业&#xff0c;自己摸索不就行了&#xff1f; 我想起之前有个博主说的一句话&#xff0c;我特别赞同&#xff0c;正好可以回答这个问题。 你做副业&#xff0c;给自己设的目标&#xff0c;就像去往自己理想的山峰。 你不付费&#xff0c;…

一文入门Ubuntu22

目录 1.安装Ubuntu22 2.常用目录 3.常用指令 1.sudo 超级用户权限运行命令 2.ls 罗列当前文件信息 3.文件目录相关&#xff1a; 1.cd改变工作路径&#xff1a; 2.pwd 3.创建目录和文件&#xff1a; 4.which 5.ps 6.kill 7.ping 4.用户相关 5.ssh与scp 6.服务相关…

数字孪生|山海鲸数据管家简介及安装步骤

哈喽&#xff0c;大家好啊&#xff0c;我是雷工&#xff01; 最近在学习数字孪生相关的软件山海鲸&#xff0c;了解到采集Modbus协议需要先安装山海鲸数据管家&#xff0c;本节先学习数据管家及安装步骤&#xff0c;以下为学习笔记&#xff1a; 1、简介 数据管家是帮用户进行…

【C语言】字符串,补充:单引号和双引号, const和define, 常量指针和指针常量

【C语言】字符串&#xff1a;一串数据类型为字符(char)的数组&#xff08;字符数组&#xff09;&#xff0c;结束符是\0。 一个字符占一个字节的内存&#xff0c;结束符\0也占一个字节的内存。 结束符 \0 &#xff1a;缩写NUL&#xff0c;空字符。表示字符串的结束。 NULL&…

vue+nodejs+小区物业报修系统2e1fq

在对平台的各个功能模块建成整合后&#xff0c;使系统能够正常的运行&#xff0c;让用户能够通过使用本系统进行物业管理。 &#xff08;1&#xff09;前台业主端预期结果&#xff1a;业主能够查看物业相关公告信息&#xff0c;能够查看自己的缴费信息以及能够报修和投诉。 &am…

Android Studio调试中的坑

1、新建Android工程后编译发现报错 2、发现无33和34的SDK更新 3、查看google相关文档 Android Gradle 插件 8.3 版本说明 | Android Studio | Android Developers 如果需要支持相关更高SDK需要的Android Studio版本和Android Gradle 插件是有版本要求的&#xff0c;相关要…

汇编——SSE对齐(一. 未对齐情况)

SIMD是(Single Instrument Multi Data)&#xff0c;MMX实现了SIMD&#xff1b;SSE是&#xff08;Streaming SIMD Extension&#xff09;&#xff0c;它取代了MMX&#xff1b;后来AVX&#xff08;Advanced Vector Extension&#xff0c;高级向量扩展&#xff09;对SSE进行了扩展…

acwing算法提高之图论--floyd算法及其扩展应用

目录 1 介绍2 训练 1 介绍 本专题介绍使用floyd算法求解的题目。 使用floyd算法&#xff0c;可以求解如下问题&#xff1a; 最短路。传递闭包。找图中的距离总和最小的环路。求恰好经过k条边的最短路。 floyd算法的原理讲解&#xff1a;基于动态规划。 状态表示d[k,i,j]&a…

nginx配置代理kibana

一、编辑kibana配置文件&#xff0c;修改server.basePath 配置文件中这行默认是注释掉的&#xff0c;我们取消注释并修改保存 server.basePath: "/elk" 二、重启kibana&#xff0c;root启动记得跟allow参数 nohup ./kibana --allow-root & 三、配置nginx代理…

Vision-Language Models for Vision Tasks: A Survey

论文地址&#xff1a;https://arxiv.org/pdf/2304.00685.pdf 项目地址&#xff1a;https://github.com/jingyi0000/VLM_survey 一、综述动机 视觉语言模型&#xff0c;如CLIP&#xff0c;以其独特的训练方式显著简化了视觉识别任务的流程。它减少了对大量精细标注数据的依赖&a…

Python selenium 使用Chrome 禁止弹出保存密码弹窗

chrome_optionwebdriver.ChromeOptions()#禁用“保存密码”弹出窗口 chrome_option.add_experimental_option("prefs",{"credentials_enable_service":False,"profile.password_manager_enabled":False})driverwebdriver.Chrome(optionschrome_o…

小组分享内容

目录 1.网络爬虫的作用&#xff08;人话&#xff09;&#xff1a; 2.使用的工具 3.不使用程序进行网页信息的获取的操作步骤 4.如何使用程序来进行上述操作 1.打开浏览器 2.输入网址 3.发送请求 4.获取响应 5.判断响应是否成功 6.获取响应里需要的内容 7.记得最后关…

2_3.Linux系统中的日志管理

# 1.journald # 服务名称&#xff1a;systemd-journald.service journalctl 默认日志存放路径&#xff1a; /run/log &#xff08;1&#xff09; journalctl命令的用法 journalctl -n 3 ##日志的最新3条--since "2020-05-01 11:00:00" ##显示11&#xff1a;00后的日…

基于STM32的汽车防窒息系统

文章目录 基于STM32的汽车防窒息系统系统简介材料展示视频制作硬件连接原理图PCB实物图GSM模块使用GSM模块代码 SGP30模块SGP30模块代码 步进电机驱动步进电机代码 其他模块主逻辑代码 总结 基于STM32的汽车防窒息系统 系统简介 随着社会的发展目前汽车的流行&#xff0c;汽车大…

GPT带我学-设计模式11-组合模式

设计模式类型 结构型设计模式 使用场景 将对象组合成树状结构来表现"部分-整体"的层次结构。这种模式能够使得客户端对单个对象和组合对象的使用具有一致性。这句话太抽象了&#xff0c;拿一个实际的网站菜单树例子来说。 例子&#xff1a;网页菜单树 一个网站的…

C++经典面试题目(十八)

1、请解释虚函数表的概念&#xff0c;并说明其在多态中的应用。 虚函数表&#xff08;Vtable&#xff09;是用于实现多态的一种机制&#xff0c;它是一个存储虚函数地址的表。每个含有虚函数的类都会有一个对应的虚函数表&#xff0c;其中存放着该类的虚函数的地址。当对象被创…

【CSS】伪元素

伪元素 常见的伪元素 ::first-line::first-letter::before 在元素第一个子元素前增加内容::after 在元素最后一个子元素后增加内容 为了区分伪类和伪元素&#xff0c;建议伪元素都使用2个冒号::first-line可以针对首行文本设置属性::first-letter可以针首字母设置属性::before…

【技巧】如何解除Excel“打开密码”?

给Excel表格设置“打开密码”&#xff0c;可以保护表格不被他人随意打开&#xff0c;那如果后续不需要保护了&#xff0c;不想每次打开Excel都需要输密码&#xff0c;要怎么去除“打开密码”呢&#xff1f; 今天分享3个方法&#xff0c;最后一个方法记得收藏起来&#xff0c;以…