Linux学习记录(十二)————共享内存

文章目录

      • 5.共享内存
        • 1.概念
        • 2.相关函数
          • 共享内存映射
          • 共享内存进程间的通信


5.共享内存

1.概念

共享内存(Shared Memory)就是允许多个进程访问同一个内存空间,是在多个进程之间共享和传递数据最 高效的方式。操作系统将不同进程之间共享内存安排为同一段物理内存,进程可以将共享内存连接到它们自 己的地址空间中,如果某个进程修改了共享内存中的数据,其它的进程读到的数据也将会改变。

  • 共享内存指令
    • ipcs -m-------查看
    • ipcrm -m shmid------删除
2.相关函数
1.int shmget(key_t key, size_t size, int shmflg);
//用来获取或创建共享内存
/*
*@param:
*		key:IPC_PRIVATE 或 ftok的返回值
*		size:共享内存区大小
*		shmflg:同open函数的权限位,也可以用8进制表示法
*@return:成功:共享内存段标识符‐‐‐ID‐‐‐文件描述符,出错:‐1
*/2.int shmctl(int shm_id, int command, struct shmid_ds *buf);
//删除共享内存对象
/*
*@return:
*		shmid:要操作的共享内存标识符
*		cmd :
*			IPC_STAT (获取对象属性)‐‐‐ 实现了命令ipcs ‐m
*			IPC_SET (设置对象属性)
*			IPC_RMID (删除对象) ‐‐‐实现了命令ipcrm ‐m
*		buf :指定IPC_STAT/IPC_SET时用以保存/设置属性
*返回值:成功:0,出错:‐1
*/注:若参数key为IPC_PRIVATE-----key值为0,方便有亲缘关系的进程间的通信

特点:

  • 1.共享内存创建之后,一直存在于内核中,直到被删除或系统关闭

  • 2.共享内存和管道不一样,读取后,内容仍然在共享内存中

创建和删除共享内存

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>int main()
{int shmid;shmid = shmget(IPC_PRIVATE,128,0777);if(shmid == -1){printf("creat share memory failed\n");return -1;}printf("creat share memory successed\n");system("ipcs -m");shmctl(shmid,IPC_RMID,NULL);system("ipcs -m");return 0;
}

在这里插入图片描述

共享内存映射

Linux共享内存映射(Shared Memory Mapping)是一种让进程之间通过内存直接交换数据的技术。它有以下几个显著的好处:

  • 效率高:共享内存避免了频繁的数据复制,因为数据直接存储在内核空间的物理地址上,读写速度通常比基于文件或网络通信快。

  • 低开销:映射操作相对轻量级,不像socket通信需要建立连接,减少了系统资源消耗。

  • 实时性:由于数据在不同进程间是直接访问的,这使得共享内存适用于对时间敏感的应用场景,如嵌入式系统、游戏引擎等。

  • 协作方便:多个进程可以同时修改同一块共享内存,这对于需要协同工作的进程非常有用,比如多线程或者多进程间的协同计算。

  • 易于同步:通过信号量、互斥锁等机制,可以更容易地控制对共享内存的访问,保证数据的一致性。

2.void *shmat(int shm_id, const void *shm_addr, int shmflg);
//把共享内存连接映射到当前进程的地址空间
/**@param:*	shm_id:ID号*	shm_addr:映射到的地址,NULL为系统自动完成的映射*	shmflg:*		SHM_RDONLY共享内存只读*		默认是0,表示共享内存可读写*@return:成功:映射后的地址,失败:NULL*/
3.int shmdt(const void *shmaddr);
//将进程里的地址映射删除
/**@return:*shmid:要操作的共享内存标识符*@return:成功:0,出错:‐1*/注:共享内存中的数据读取之后仍存在!

共享内存映射

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
int main()
{int shmid;key_t key;char *p;key = ftok("a.c",1);	if(key == -1){printf("create key failed\n");return -2;}printf("creat key successed key is %x\n",key);shmid = shmget(key,128,IPC_CREAT|0777);if(shmid == -1){printf("create share memory failed\n");return -1;}printf("creat share memory successed of shmid is %d\n",shmid);system("ipcs -m");p = (char *)shmat(shmid,NULL,0);if(p == NULL){printf("create share memory Mapping failed\n ");}//write fgets(p,128,stdin);//readprintf("share memory Mapping is %s\n",p);printf("Second share memory Mapping is %s\n",p);shmdt(p);shmctl(shmid,IPC_RMID,NULL);system("ipcs -m");return 0;
}

在这里插入图片描述

ipcrm -m shmid实现

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char * argv[])
{int shmid;if(argc != 3){printf("param error\n");return -1;}if(strcmp(argv[1],"-m") == 0){printf("delete share memory");}else{printf("error");return -2;}shmid = atoi(argv[2]);shmctl(shmid,IPC_RMID,NULL);system("ipcs -m");return 0;
}

在这里插入图片描述

共享内存进程间的通信

思路:一个收一个发

//shm_write
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{int shmid;key_t key;char *p;key = ftok("a.c",1);	if(key == -1){printf("create key failed\n");return -2;}printf("creat key successed key is %x\n",key);shmid = shmget(key,128,IPC_CREAT|0777);//创建共享内存if(shmid == -1){printf("create share memory failed\n");return -1;}printf("creat share memory successed of shmid is %d\n",shmid);system("ipcs -m");p = (char *)shmat(shmid,NULL,0);//获取共享内存映射地址if(p == NULL){printf("create share memory Mapping failed\n ");}//write fgets(p,128,stdin);sleep(8);shmdt(p);shmctl(shmid,IPC_RMID,NULL);return 0;
}
//shm_read
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
int main()
{int shmid;key_t key;char *p;key = ftok("a.c",1);//获取key值if(key == -1){printf("create key failed\n");return -2;}printf("creat key successed key is %x\n",key);shmid = shmget(key,128,0);//不创建新的共享内存只借助Key值获取shmidif(shmid == -1){printf("create share memory failed\n");return -1;}printf("creat share memory successed of shmid is %d\n",shmid);system("ipcs -m");p = (char *)shmat(shmid,NULL,0);//获取p的地址if(p == NULL){printf("create share memory Mapping failed\n ");}//readprintf("share memory Mapping is %s\n",p);shmdt(p);return 0;
}

在这里插入图片描述

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

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

相关文章

HTML5+JavaScript绘制彩虹和云朵

HTML5JavaScript绘制彩虹和云朵 彩虹&#xff0c;简称虹&#xff0c;是气象中的一种光学现象&#xff0c;当太阳光照射到半空中的水滴&#xff0c;光线被折射及反射&#xff0c;在天空上形成拱形的七彩光谱&#xff0c;由外圈至内圈呈红、橙、黄、绿、蓝、靛、紫七种颜色。事实…

【流媒体】RTMPDump—RTMP_ConnectStream(创建流连接)

目录 1. RTMP_ConnectStream函数1.1 读取packet&#xff08;RTMP_ReadPacket&#xff09;1.2 解析packet&#xff08;RTMP_ClientPacket&#xff09;1.2.1 设置Chunk Size&#xff08;HandleChangeChunkSize&#xff09;1.2.2 用户控制信息&#xff08;HandleCtrl&#xff09;1…

嵌入式开发就业方向有哪些?前景未来可期!

在科技日新月异的今天&#xff0c;嵌入式系统几乎渗透到了我们生活的各个角落。从简单的家用电器到复杂的工业自动化设备&#xff0c;再到我们手中的智能手机&#xff0c;无一不体现出嵌入式技术的魅力。因此&#xff0c;嵌入式领域的就业前景广阔&#xff0c;为众多求职者提供…

职场难题怎么破?六西格玛培训给你答案!

在当今追求高效与卓越的职场环境中&#xff0c;六西格玛培训如同一股强劲的东风&#xff0c;为众多职场人士带来了提升自我、突破瓶颈的契机。作为起源于摩托罗拉、在通用电气得到广泛应用的管理方法论&#xff0c;六西格玛以其严谨的数据分析、持续的流程优化和卓越的质量提升…

公认最强充电宝有哪些?盘点四款公认强悍级别充电宝推荐

随着智能手机和其他移动设备的广泛应用&#xff0c;充电宝已经成为我们生活中不可或缺的一部分。然而&#xff0c;市场上众多品牌和型号的充电宝也让消费者面临选择难题&#xff0c;安全隐患也随之浮现。因此&#xff0c;选择一款安全可靠、性能卓越的充电宝显得尤为重要。本文…

[数据集][目标检测]起子检测数据集VOC+YOLO格式1215张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1215 标注数量(xml文件个数)&#xff1a;1215 标注数量(txt文件个数)&#xff1a;1215 标注…

python逻辑控制 学习

if 语句 普通if &#xff0c;与多条件语句 #! /usr/bin/python3 age int(input("请输入你的年龄&#xff1a;")) print("你今年", age, "岁了。") if age < 18:print("你还未成年&#xff0c;请多加努力&#xff01;") elif age …

[802.11e]WMM

WMM概念 WiFi WMM&#xff08;无线多媒体&#xff09;是一种用于无线局域网&#xff08;WLAN&#xff09;的QoS&#xff08;服务质量&#xff09;标准。WMM旨在提供更好的网络性能&#xff0c;特别是在传输多媒体内容&#xff08;如音频和视频&#xff09;时。它通过对不同类型…

Halcon20.11深度学习目标检测模型

1.前言&#xff1a;.Halcon的深度学习标注工具一直在更新&#xff0c;我下载的20.11版本的Deep Learning Tool已经显示过期&#xff0c;无奈只能下载最新版MVTec Deep Learning Tool 24.05。不过最新版的标注工具做的很人性化&#xff0c;分类&#xff0c;目标检测&#xff0c;…

获取阿里云Docker镜像加速器地址

注册并登录阿里云账号&#xff1a;首先&#xff0c;你需要有一个阿里云账号。如果还没有&#xff0c;可以在阿里云官网注册。 访问容器镜像服务&#xff1a;登录后&#xff0c;进入“产品与服务”&#xff0c;找到“容器服务”或“容器镜像服务”。阿里云容器服务 找到镜像加…

iOS开发进阶(二十二):Xcode* 离线安装 iOS Simulator

文章目录 一、前言二、模拟器安装 一、前言 Xcode 15 安装包的大小相比之前更小&#xff0c;因为除了 macOS 的 Components&#xff0c;其他都需要动态下载安装&#xff0c;否则提示 iOS 17 Simulator Not Installed。 如果不安装对应的运行模拟库&#xff0c;真机和模拟器无法…

【UE】关卡实例基本介绍与使用

目录 一、什么是关卡实例 二、创建关卡实例 三、编辑关卡实例 四、破坏关卡实例 五、创建关卡实例蓝图 一、什么是关卡实例 关卡实例本质上是一个已存在关卡的可重复使用的实例化版本。它基于原始关卡&#xff0c;但可以在运行时进行独立的修改和定制&#xff0c;同时保持…

哪个牌子的开放式耳机性价比高?五款地表最强机型推荐!

在我们的日常生活中&#xff0c;街道、地铁车厢或公交车等地方常常充满了噪音&#xff0c;这些杂音不仅可能扰乱心情&#xff0c;还可能对我们的听力造成潜在的伤害。在这样的环境下&#xff0c;如果想要享受音乐或追剧&#xff0c;同时又能保持对周围环境的警觉&#xff0c;开…

【WebSocket】websocket学习【二】

1.需求&#xff1a;通过websocket实现在线聊天室 2.流程分析 3.消息格式 客户端 --> 服务端 {"toName":"张三","message":"你好"}服务端 --> 客户端 系统消息格式&#xff1a;{"system":true,"fromName"…

全自动内衣洗衣机什么牌子好?五款业界高性能内衣洗衣机推荐

在日常生活中&#xff0c;内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;市场上众多内衣洗衣机品牌琳琅满目&#xff0c;让我们往往难以选择。那么&a…

google浏览器chrome用户数据(拓展程序,书签等)丢失问题

一、问题背景 我出现这个情况的问题背景是&#xff1a;因为C盘块满了想清理一部分空间&#xff08;具体看这&#xff1a;windows -- C盘清理_c盘softwaredistribution-CSDN博客&#xff09;&#xff0c;于是找到了更改AppDatta这个方法&#xff0c;但因为&#xff0c;当时做迁移…

文本匹配任务(上)

文本匹配任务 1.文本匹配介绍1.1文本匹配定义1.1.1狭义定义1.1.2广义定义 1.2文本匹配应用1.2.1问答对话1.2.1信息检索 2.文本匹配--智能问答2.1基本思路2.2技术路线分类2.2.1按基础资源划分2.2.2 答案生成方式2.2.3 NLP技术 2.3智能问答-Faq知识库问答2.3.1运行逻辑2.3.2核心关…

QT中鼠标事件示例(包含点击,点击之后移动,释放的坐标获取)

QT中的鼠标事件 简介&#xff1a;结果展示&#xff1a;实例代码&#xff1a; 简介&#xff1a; 在Qt中&#xff0c;处理鼠标事件是图形用户界面&#xff08;GUI&#xff09;编程中的一个重要方面。Qt通过一系列的事件处理函数来支持鼠标事件的响应。这些事件包括鼠标点击&…

【容器安全系列Ⅲ】- 深入了解Capabilities的作用

在本系列的上一部分中&#xff0c;我们提到 Docker 容器尚未使用 time 命名空间。我们还探讨了容器在许多情况下如何以 root 用户身份运行。考虑到这两点&#xff0c;如果我们尝试更改容器内的日期和时间会发生什么&#xff1f; 为了测试这一点&#xff0c;我们先运行 docker r…

Golang | Leetcode Golang题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; func countBits(n int) []int {bits : make([]int, n1)for i : 1; i < n; i {bits[i] bits[i&(i-1)] 1}return bits }