嵌入式学习——进程间通信方式(3)—— 共享内存
一、基本概念
什么是共享内存,顾名思义,就是将共享一片内存空间,共享内存允许多个不同的进程访问同一片内存空间。他们对这个内存直接进行操作,不需要经过内核的处理,因此共享内存是IPC通信方式中效率最高的。那如何实现的呢,只要你想访问这片内存空间,你得先把这片内存空间映射到你的内存中,然后再对其进行操作。
但是,这种内存空间我们要对其进行维护,保护的一个操作,例如:进程A往共享内存存数据,而此时进程B刚好在读数据,那B读取的数据就可能会出现数据混乱,因此,共享内存属于临界资源,我们在操作它时要进行保护操作,即在某一个时刻,只有一个进程对其进行读/写操作,防止数据出现混乱。所以共享内存一般不会单独的进行使用,要配合信号量、互斥锁等来进行使用,目的就是保护数据的完整性。

特点:1)共享内存是进程间通信效率最高的方式之一
2)共享内存可传输的数据量比较大,使用共享内存一般是以传输数据为目的的
3)读取过的内容不会删除,某一个进程修改共享内存空间的数据后,其他进程可以察觉这个修改
4)无同步无互斥,需要信号量配合。
二、基本使用流程
1)创建或获取共享内存
int shmget(key_t key, size_t size, int shmflg);
key的取值:
① 通过调用key_t ftok(const char *pathname, int proj_id)来进行获取;这个函数是通过指定的文件路径和计划编号合成一个key值。
② IPC_PRIVATE 内核会保证创建一个新的,唯一的IPC对象,这是一个宏定义,其值为0。
size:指定共享内存的大小,是以页为单位的,即使存1个字节,也会分配一整页。
shmflg:IPC_CREAT 若系统中有相同的key值,则返回共享内存的标识符;若不存在则创建,要与 0600 结合 给相应的权限(IPC_CREAT | 0600)。
IPC_EXCL 如果系统中有相同的key值,则会报错;不存在则创建。
2)将共享内存映射到当前进程中
void *shmat(int shmid, const void *shmaddr, int shmflg);
shmid:就是创建共享内存时返回的描述符。
shmaddr:一般为NULL,系统会帮你自动选择一个内存空间去分配。
shmflg:操作共享内存的方式:
SHM_RDONLY:以只读方式打开。
SHM_EXEC:具有执行的权限。
SHM_REMAP:重新映射,此时shmaddr不能为空。
3)操作共享内存
直接针对映射后返回的指针进行操作,给指针进行赋值。
4)断开共享内存映射
int shmdt(const void *shmaddr);
shmaddr:映射的共享内存的地址。
成功返回0,失败返回-1,并将错误记录。
5)释放共享内存
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmid:共享内存的标识符
cmd:常用的控制命令如下:
IPC_RMID:删除该共享内存
IPC_STAT:获取属性权限,放到buf中
IPC_SET:设置属性信息为buf指向的内容。
IPC_INFO:获得关于共享内存的系统限制值信息。
SHM_INFO:获得系统为共享内存消耗的资源信息。
buf:在释放共享内存时,为NULL即可。
struct shmid_ds {struct ipc_perm shm_perm; /* Ownership and permissions */size_t shm_segsz; /* Size of segment (bytes) */time_t shm_atime; /* Last attach time */time_t shm_dtime; /* Last detach time */time_t shm_ctime; /* Last change time */pid_t shm_cpid; /* PID of creator */pid_t shm_lpid; /* PID of last shmat(2)/shmdt(2) */shmatt_t shm_nattch; /* No. of current attaches */...};
struct ipc_perm {key_t __key; /* Key supplied to shmget(2) */uid_t uid; /* Effective UID of owner */gid_t gid; /* Effective GID of owner */uid_t cuid; /* Effective UID of creator */gid_t cgid; /* Effective GID of creator */unsigned short mode; /* Permissions + SHM_DEST andSHM_LOCKED flags */unsigned short __seq; /* Sequence number */};
三、代码示例
一个进程负责读取你的个人信息并写入到共享内存,另一个进程负责将共享内存中的个人信息进行打印
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <wait.h>struct info
{char name[50];int age;char address[100];
}DATA;int main()
{struct info data = {"zhangsan",22,"xian"};key_t key = ftok("/bin/bash",1);if(key == -1){perror("failed1");return -1;}//创建一个共享内存int shmid = shmget(key,sizeof(struct info),IPC_CREAT | 0600);if(shmid == -1){perror("failed2");return -1;}//进行共享内存的映射char * buf = (char*)shmat(shmid,NULL,0);if(*(int*)buf == -1 ){perror("failed3");return -2;}pid_t pid = fork();//子进程负责读共享内存的数据并打印if(pid == 0){sleep(3);printf("%s\n",buf);shmdt(buf);exit(0);}//父进程往共享内存中写入数据else if(pid >0){char arr[5] =""; snprintf(arr,sizeof(arr),"%d",data.age);snprintf(buf,sizeof(struct info),"%s %s %s",data.name,arr,data.address);wait(NULL);//等待子进程结束shmdt(buf);//关闭内存映射shmctl(shmid,IPC_RMID,NULL);//释放内存资源}return 0;
}
相关文章:
嵌入式学习——进程间通信方式(3)—— 共享内存
一、基本概念 什么是共享内存,顾名思义,就是将共享一片内存空间,共享内存允许多个不同的进程访问同一片内存空间。他们对这个内存直接进行操作,不需要经过内核的处理,因此共享内存是IPC通信方式中效率最高的。那如何实…...
python开发讯飞星火
一、讯飞星火网址 星火认知大模型Web API文档 | 讯飞开放平台文档中心 二、pycharm安装 pip3 install --upgrade spark_ai_python...
自然语言处理(jieba库分词)
1、完全切分法、正向最大匹配算法、逆向最大匹配算法和双向最大匹配算法 一、实验内容 一个好的NLP系统一定要有完备的词典,用于判断算法分出的词是否是具有实际意义的词。自定义一个词典,比如dic ["项目", "研究", "目的&q…...
MYSQL-查看函数创建语句语法(五)
SHOW CREATE FUNCTION 语句 SHOW CREATE FUNCTION func_name此语句类似于 SHOW CREATE PROCEDURE 的方法,但用于存储过程。 mysql> show create function world.sum \G *************************** 1. row ***************************Function: sumsql_mode:…...
图解IRF
FW1 配置思路 ① 配置IRF优先级 确认设备的主次 ② 设置批量操作的接口方便后续操作 interface range name fw-irf interface GigabitEthernet1/0/2 to GigabitEthernet1/0/3 ③ 接口 showdown 关闭接口 ④ 创建的IRF 1/1 成员的对应的接口的是 GE1/0/2 GE/1/0/3 ⑤ 开放IRF对…...
关于Chrome浏览器F12调试,显示未连接到互联网的问题
情况说明 最近笔者更新下电脑的Chrome浏览器,在调试前端代码的时候,遇到下面一个情况: 发现打开调试面板后,页面上显示未连接到互联网,但实际电脑网络是没有问题的,关闭调试面板后,网页又能正…...
南沙csp-j/s一对一家教 解一本通题: 1937:【06NOIP普及组】数列
【题目描述】 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k3时,这个序列是: 1,3,4,9,10,12,13&a…...
【分布式微服务云原生】K8s(Kubernetes)基本概念和使用方法
Kubernetes简称K8S,是一个强大的开源容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它最初由Google设计,并由Cloud Native Computing Foundation(CNCF)维护。以下是Kubernetes的一些基本概念和使用方法。 基本概念 集…...
引入Scrum激发研发体系活力
引言 在当今快速变化的技术环境中,IT企业面临着持续的市场压力和竞争,传统的瀑布式开发模式已经难以满足现代企业的需要。瀑布模型过于僵化,缺乏灵活性,导致项目经常延期,成本增加,最终可能无法达到预期效果…...
JAVA开源项目 技术交流分享平台 计算机毕业设计
本文项目编号 T 053 ,文末自助获取源码 \color{red}{T053,文末自助获取源码} T053,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…...
Linux学习笔记之重点概念、实用技巧和常见问题解答。
Linux学习笔记的内容涵盖了从基础知识到高级应用的各个方面,包括重点概念、实用技巧和常见问题解答。以下是对这些内容的详细描述: 一、重点概念 1. Linux简介:Linux是一种自由和开放源代码的类UNIX操作系统,由林纳斯本纳第克特托…...
“数字武当”项目荣获2024年“数据要素×”大赛湖北分赛文化旅游赛道一等奖
9月26日,由国家数据局、湖北省人民政府指导的首届湖北省数据要素创新大会暨2024年“数据要素”大赛湖北分赛颁奖仪式在湖北武汉举行。由大势智慧联合武当山文化旅游发展集团有限公司参报的武当山“数字武当”项目,荣获文化旅游赛道一等奖。 据悉&#x…...
开箱即用的大模型应用跟踪与批量测试方案
背景介绍 最近抽空参加了一个讯飞的 RAG 比赛,耗时两周终于在最后一天冲上了榜首。 整体的框架是基于 RAG 能力有点弱弱的 Dify 实现。在比赛调优的过程中,经常需要批量提交几百个问题至 Dify 获取回答,并需要跟踪多轮调优的效果差异。借助…...
在MySQL中,要查询所有用户及其权限,您可以使用以下命令:
文章目录 1、查询所有用户1.1、登录数据库1.2、select user,host from mysql.user; 2、查看用户的权限 1、查询所有用户 1.1、登录数据库 [rootlocalhost ~]# docker exec -it spzx-mysql /bin/bash rootab66508d9441:/# mysql -uroot -p123456 mysql: [Warning] Using a pas…...
VMware下载安装教程
目录 一.下载二.安装 一.下载 官网地址:官网 下载的时候选择Workstation Player,这个是免费的,当然你也可以选择下载Workstation Pro。 二.安装 下载完成之后点击安装包按照需要安装即可。 安装之后启动,可以看到这个能够免费使…...
AI跟踪报道第58期-新加坡内哥谈技术-本周AI新闻: OpenAI动荡时刻和Meta从未如此动人
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
深入理解 Nuxt.js 中的 app:error:cleared 钩子
title: 深入理解 Nuxt.js 中的 app:error:cleared 钩子 date: 2024/9/28 updated: 2024/9/28 author: cmdragon excerpt: Nuxt.js 中的 app:error:cleared 钩子的用途及其实现方式。这个钩子为开发者提供了一种优雅的方式来处理错误清除后的状态恢复和用户反馈。 categor…...
国内白帽子能赚多少钱?有多少白帽子全职挖洞能养活自己?零基础兼职挖漏洞收藏这一篇就够了
经常会有粉丝朋友私信大白,想探究一下国内的SRC(安全响应中心)平台究竟支持了多少白帽黑客的生活?又有多少白帽黑客能够不依赖于传统工作,全职从事漏洞挖掘并以此维生?以下信息或许可以为那些有意踏上这条道…...
速盾:cdn是怎么加速视频的?
CDN(Content Delivery Network)是一种网络加速服务,通过将内容分发到全球各地的服务器节点上,提供更快速度和更可靠的内容传输。当涉及到视频内容时,CDN起到了至关重要的作用,它通过一系列的技术和策略来加…...
前台项目启动/打包报错 Error: error:0308010C:digital envelope routines::unsupported
在package.json中修改启动/打包语句 如图,我这里是打包时候报错,就在build里前面加上 set NODE_OPTIONS--openssl-legacy-provider && 再次打包,成功。...
ElevenLabs泰米尔文TTS接入全链路详解:从API密钥配置、音色微调到低延迟流式响应(附3个避坑代码片段)
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs泰米尔文TTS接入全链路详解:从API密钥配置、音色微调到低延迟流式响应(附3个避坑代码片段) ElevenLabs 自 2024 年起正式支持泰米尔语(ta-IN&a…...
ElevenLabs藏文语音生成上线仅72小时:开发者必须立即掌握的5个API调用避坑要点
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs藏文语音生成上线背景与技术意义 藏语作为中国官方认可的少数民族语言之一,拥有超过600万母语使用者,主要分布在西藏、青海、四川、甘肃和云南等地区。长期以来&…...
Visual C++运行库终极指南:如何一键修复所有Windows程序依赖问题
Visual C运行库终极指南:如何一键修复所有Windows程序依赖问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过打开软件时突然弹出&…...
MySQL复合查询与内外连接
1:笛卡尔积1:什么是笛卡尔积笛卡尔积就是两张表所有记录的所有可能组合。举个最简单的例子:表 A 有 2 条记录:[苹果,香蕉]表 B 有 3 条记录:[红色,黄色,绿色]它们的笛卡尔积就是 236…...
Ubuntu 全面拥抱 Rust 后,我意识到 Rust 社区要变了
文章目录Ubuntu 全面拥抱 Rust 后,我意识到 Rust 社区要变了“赢”与挑战并存从早期采用者到早期大众如何将应用推广转化为实际投入Rust 社区最需要的是共情小结Ubuntu 全面拥抱 Rust 后,我意识到 Rust 社区要变了 Canonical 正在全面推进 Ubuntu 系统向…...
国产 KVM 兼容痛点及全国产定制方案
作为标准 KVM、军工加固 KVM 产品经理,在一些项目落地过程中,我发现一个普遍问题:国产服务器、国产系统越来越普及,但市面上绝大多数 KVM 切换器,兼容性问题频发,已经成为运维短板。一、当前 KVM 最常见的兼…...
为内容生成应用动态切换 Taotoken 上的不同模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为内容生成应用动态切换 Taotoken 上的不同模型 在内容创作类应用的开发中,一个常见的需求是根据不同的文本类型&#…...
别再手动画UML了!用IDEA Diagrams插件自动生成类关系图,附赠符号含义速查表
高效架构可视化:IDEA Diagrams插件全指南与UML符号解析 在软件开发过程中,清晰的架构设计是团队协作和代码维护的基石。传统的手绘UML类图不仅耗时费力,更难以与快速迭代的代码保持同步。JetBrains IDEA内置的Diagrams插件正是为解决这一痛点…...
Motorola LS2208条码扫描器USB接口模式解析与Python数据采集实战
1. 项目概述:从“扫码枪”到数据采集终端在仓库、快递站或者超市收银台,我们每天都能看到工作人员拿着一个像手枪一样的东西,“嘀”一声,商品信息就录入了系统。这个设备就是条码扫描器,很多人习惯叫它“扫码枪”。你可…...
WinGet安装工具:PowerShell自动化部署的架构解析与实践指南
WinGet安装工具:PowerShell自动化部署的架构解析与实践指南 【免费下载链接】winget-install Install WinGet using PowerShell! Prerequisites automatically installed. Works on Windows 10/11 and Server 2019/2022. 项目地址: https://gitcode.com/gh_mirror…...
