嵌入式学习——进程间通信方式(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 && 再次打包,成功。...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
