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

【进程间通信】共享内存

原理

进程间通信的本质是让不同进程看到同一份资源

共享内存是内存的一部分,进程间通过共享内存通信首先申请共享内存,然后再把共享内存挂接到自己的进程地址空间(虚拟地址)的共享区,返回首地址

特性

1.共享内存没有同步互斥之类的保护机制

2.共享内存是所有进程间通信中最快的,因为拷贝少

3.共享内存内部的数据有用户维护

接口 

申请共享内存

 挂接地址空间

取消挂接 

删除和获取共享内存属性

测试代码--利用共享内存

看看怎么利用接口,申请共享内存,挂接,删除

commom.hpp

#pragma once#include<iostream>
#include<string>
#include<unistd.h>
#include<cstring>
#include <sys/ipc.h>
#include <sys/shm.h>#include"log.hpp"using namespace std;Log log;
const int size=4096;
const string pathname="/home/defa/";
const int proj_id=0x6666;key_t Getkey()
{key_t key=ftok(pathname.c_str(),proj_id);if(key<0){log(Fatal,"ftok error:%s",strerror(errno));exit(1);}log(Info,"get key success,key:%x",key);return key;
}
int Getsharedmemory(int flag)
{key_t key=Getkey();int shmid=shmget(key,size,flag);if(shmid<0){log(Fatal,"creat share memory error:%s",strerror(errno));exit(2);}log(Info,"creat share memory success,shmid:%d",shmid);return shmid;
}int Creatshm()
{return Getsharedmemory(IPC_CREAT|IPC_EXCL|0664);
}int Getshm()
{return Getsharedmemory(IPC_CREAT);
}

client.cc

#include "commom.hpp"int main()
{// 客户端进行创建共享内存int shmid = Creatshm();// 挂接到自己的进程地址空间中char *sharespace = (char *)shmat(shmid, nullptr, 0);// 直接利用共享内存,进行读取,就把他当成自己的内存使用了struct shmid_ds shmds;while (true){cout << "client say@ " << sharespace<<endl ;sleep(1);shmctl(shmid, IPC_STAT, &shmds);//获取共享内存属性cout << "shm size: " << shmds.shm_segsz << endl;cout << "shm nattch: " << shmds.shm_nattch << endl;printf("shm key: 0x%x\n", shmds.shm_perm.__key);cout << "shm mode: " << shmds.shm_perm.mode << endl;}// 取消挂接shmdt(sharespace);// 删除共享内存shmctl(shmid, IPC_RMID, nullptr);return 0;
}

server.cc

#include"commom.hpp"int main()
{//服务端获取共享内存int shmid=Getshm();//挂接char* sharespace=(char*)shmat(shmid,nullptr,0);//进行写入// 一旦有了共享内存,挂接到自己的地址空间中,你直接把他当成你的内存空间来用即可!// 不需要调用系统调用while(true){cout<<"server say@ ";fgets(sharespace,4096,stdin);}//取消挂接shmdt(sharespace);return 0;
}

命令行指令

查看共享内存

删除共享内存

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 冒泡法排序:本题要求将给定的n个整数从小到大排序后输出。输出时相邻数字中间用一个空格分开,行末不得有多余空格。
  • 【QT】学习笔记:枚举桌面窗口句柄
  • Kafka【三】Windows下安装Kafka集群
  • 使用VM创建centos7环境
  • 淘宝扭蛋机小程序开发,吸引更多的消费者
  • 海外媒体发布:12个旅游业发展媒体宣发对策,给你提升曝光量
  • 解决el-table中使用el-input无法聚焦问题
  • 加速产品研发:项目管理软件与团队的协同之道
  • easy_fastapi Python 后端开发框架
  • Python 与 Excel 图表自动化:让数据“会说话”
  • 使用Qdrant + CNCLIP + Gradio 实现图文检索
  • SprinBoot+Vue图书馆预约与占座微信小程序的设计与实现
  • CISAW认证培训的方向包括多少种?
  • GNN会议期刊汇总(人工智能、机器学习、深度学习、数据挖掘)
  • 基于STM32的猫狗宠物喂养系统设计(微信小程序)(215)
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 2019.2.20 c++ 知识梳理
  • Java精华积累:初学者都应该搞懂的问题
  • java取消线程实例
  • npx命令介绍
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • SpingCloudBus整合RabbitMQ
  • Vue实战(四)登录/注册页的实现
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 观察者模式实现非直接耦合
  • 力扣(LeetCode)56
  • 人脸识别最新开发经验demo
  • 日剧·日综资源集合(建议收藏)
  • 入口文件开始,分析Vue源码实现
  • 微信支付JSAPI,实测!终极方案
  • 我与Jetbrains的这些年
  • 小试R空间处理新库sf
  • 与 ConTeXt MkIV 官方文档的接驳
  • 原生 js 实现移动端 Touch 滑动反弹
  • ​520就是要宠粉,你的心头书我买单
  • ​io --- 处理流的核心工具​
  • ​iOS实时查看App运行日志
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • # 数据结构
  • ###STL(标准模板库)
  • #{}和${}的区别是什么 -- java面试
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #在 README.md 中生成项目目录结构
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (论文阅读30/100)Convolutional Pose Machines
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (一)80c52学习之旅-起始篇
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原)Matlab的svmtrain和svmclassify
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现