当前位置: 首页 > news >正文

嵌入式学习——进程间通信方式(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)—— 共享内存

一、基本概念 什么是共享内存&#xff0c;顾名思义&#xff0c;就是将共享一片内存空间&#xff0c;共享内存允许多个不同的进程访问同一片内存空间。他们对这个内存直接进行操作&#xff0c;不需要经过内核的处理&#xff0c;因此共享内存是IPC通信方式中效率最高的。那如何实…...

python开发讯飞星火

一、讯飞星火网址 星火认知大模型Web API文档 | 讯飞开放平台文档中心 二、pycharm安装 pip3 install --upgrade spark_ai_python...

自然语言处理(jieba库分词)

1、完全切分法、正向最大匹配算法、逆向最大匹配算法和双向最大匹配算法 一、实验内容 一个好的NLP系统一定要有完备的词典&#xff0c;用于判断算法分出的词是否是具有实际意义的词。自定义一个词典&#xff0c;比如dic ["项目", "研究", "目的&q…...

MYSQL-查看函数创建语句语法(五)

SHOW CREATE FUNCTION 语句 SHOW CREATE FUNCTION func_name此语句类似于 SHOW CREATE PROCEDURE 的方法&#xff0c;但用于存储过程。 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浏览器&#xff0c;在调试前端代码的时候&#xff0c;遇到下面一个情况&#xff1a; 发现打开调试面板后&#xff0c;页面上显示未连接到互联网&#xff0c;但实际电脑网络是没有问题的&#xff0c;关闭调试面板后&#xff0c;网页又能正…...

南沙csp-j/s一对一家教 解一本通题: 1937:【06NOIP普及组】数列

【题目描述】 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列&#xff0c;例如&#xff0c;当k3时&#xff0c;这个序列是&#xff1a; 1&#xff0c;3&#xff0c;4&#xff0c;9&#xff0c;10&#xff0c;12&#xff0c;13&a…...

【分布式微服务云原生】K8s(Kubernetes)基本概念和使用方法

Kubernetes简称K8S,是一个强大的开源容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它最初由Google设计&#xff0c;并由Cloud Native Computing Foundation&#xff08;CNCF&#xff09;维护。以下是Kubernetes的一些基本概念和使用方法。 基本概念 集…...

引入Scrum激发研发体系活力

引言 在当今快速变化的技术环境中&#xff0c;IT企业面临着持续的市场压力和竞争&#xff0c;传统的瀑布式开发模式已经难以满足现代企业的需要。瀑布模型过于僵化&#xff0c;缺乏灵活性&#xff0c;导致项目经常延期&#xff0c;成本增加&#xff0c;最终可能无法达到预期效果…...

JAVA开源项目 技术交流分享平台 计算机毕业设计

本文项目编号 T 053 &#xff0c;文末自助获取源码 \color{red}{T053&#xff0c;文末自助获取源码} T053&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…...

Linux学习笔记之重点概念、实用技巧和常见问题解答。

Linux学习笔记的内容涵盖了从基础知识到高级应用的各个方面&#xff0c;包括重点概念、实用技巧和常见问题解答。以下是对这些内容的详细描述&#xff1a; 一、重点概念 1. Linux简介&#xff1a;Linux是一种自由和开放源代码的类UNIX操作系统&#xff0c;由林纳斯本纳第克特托…...

“数字武当”项目荣获2024年“数据要素×”大赛湖北分赛文化旅游赛道一等奖

9月26日&#xff0c;由国家数据局、湖北省人民政府指导的首届湖北省数据要素创新大会暨2024年“数据要素”大赛湖北分赛颁奖仪式在湖北武汉举行。由大势智慧联合武当山文化旅游发展集团有限公司参报的武当山“数字武当”项目&#xff0c;荣获文化旅游赛道一等奖。 据悉&#x…...

开箱即用的大模型应用跟踪与批量测试方案

背景介绍 最近抽空参加了一个讯飞的 RAG 比赛&#xff0c;耗时两周终于在最后一天冲上了榜首。 整体的框架是基于 RAG 能力有点弱弱的 Dify 实现。在比赛调优的过程中&#xff0c;经常需要批量提交几百个问题至 Dify 获取回答&#xff0c;并需要跟踪多轮调优的效果差异。借助…...

在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下载安装教程

目录 一.下载二.安装 一.下载 官网地址&#xff1a;官网 下载的时候选择Workstation Player&#xff0c;这个是免费的&#xff0c;当然你也可以选择下载Workstation Pro。 二.安装 下载完成之后点击安装包按照需要安装即可。 安装之后启动&#xff0c;可以看到这个能够免费使…...

AI跟踪报道第58期-新加坡内哥谈技术-本周AI新闻: OpenAI动荡时刻和Meta从未如此动人

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为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…...

国内白帽子能赚多少钱?有多少白帽子全职挖洞能养活自己?零基础兼职挖漏洞收藏这一篇就够了

经常会有粉丝朋友私信大白&#xff0c;想探究一下国内的SRC&#xff08;安全响应中心&#xff09;平台究竟支持了多少白帽黑客的生活&#xff1f;又有多少白帽黑客能够不依赖于传统工作&#xff0c;全职从事漏洞挖掘并以此维生&#xff1f;以下信息或许可以为那些有意踏上这条道…...

速盾:cdn是怎么加速视频的?

CDN&#xff08;Content Delivery Network&#xff09;是一种网络加速服务&#xff0c;通过将内容分发到全球各地的服务器节点上&#xff0c;提供更快速度和更可靠的内容传输。当涉及到视频内容时&#xff0c;CDN起到了至关重要的作用&#xff0c;它通过一系列的技术和策略来加…...

前台项目启动/打包报错 Error: error:0308010C:digital envelope routines::unsupported

在package.json中修改启动/打包语句 如图&#xff0c;我这里是打包时候报错&#xff0c;就在build里前面加上 set NODE_OPTIONS--openssl-legacy-provider && 再次打包&#xff0c;成功。...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...