【Linux进程间通信】共享内存

news2024/9/19 11:58:35

共享内存

  • API
  • 简单案例:一个进程往共享内存中写一次数据然后在另一块共享内存读一次数据,然后另一个进程在一个共享内存读一次数据在另一块共享内存写一次数据(同时验证了它是半双工的)
  • 使用信号量进行同步

原理:多个进程映射到同一块内存

半双工

Linux进程通信中最快的

API

 1.int shmget(key_t key, size_t size, int shmflg);  用于创建或者获取共享内存
   
 - key:不同进程使用相同的key可以获取到同一块内存
 -    size:创建共享内存时,指定要申请的共享内存空间大小,以字节为单位。
 -    shmflg:IPC_CREAT 存在则打开,不存在则创建。
 -    IPC_CREAT与IPC_EXCL一起使用,存在则会报错,不存在则创建
 - return 成功返回共享内存的ID,失败返回-1
2.void *shmat(int   shmid, const void *shmaddr, int shmflg); 将共享内存映射到进程的地址空间
 
 
 shmaddr:一般给NULL,由系统自动选择映射的虚拟地址空间
 shmflg:不指定时给0
 return 成功返回共享内存的首地址,失败返回NULL
 3.int shmdt(const void    *shmaddr);断开当前进程的shmaddr指向的共享内存映射
 return 成功返回0,失败返回-1

简单案例:一个进程往共享内存中写一次数据然后在另一块共享内存读一次数据,然后另一个进程在一个共享内存读一次数据在另一块共享内存写一次数据(同时验证了它是半双工的)

a.cpp

#include<iostream>
#include<unistd.h>
#include<cstring>
#include<sys/shm.h>
int main()
{
 int shmid = shmget((key_t)123456,128,IPC_CREAT|0600);
    if(-1 == shmid)
    {
        std::cout<<"shmget erro"<<std::endl;
        exit(-1);
    }
    char * s = (char *)shmat(shmid,nullptr,0);
    if(s == (char *)-1)
    {
        std::cout<<"shmat erro"<<std::endl;
    }
    int shmid2 = shmget((key_t)123457,128,IPC_CREAT|0600);
    if(-1 == shmid2)
    {
        std::cout<<"shmget erro"<<std::endl;
        exit(-1);
    }
    char * s2 = (char *)shmat(shmid2,nullptr,0);
    if(s2 == (char *)-1)
    {
        std::cout<<"shmat erro"<<std::endl;
    }
    strcpy(s,"hello1");
    sleep(1);
    std::cout<<s2;
    shmdt(s);
    shmdt(s2);
    exit(0);
}

b.cpp

#include<iostream>
#include<unistd.h>
#include<cstring>
#include<sys/shm.h>
int main()
{
    int shmid = shmget((key_t)123456,128,IPC_CREAT|0600);
    if(-1 == shmid)
    {
        std::cout<<"shmget erro"<<std::endl;
        exit(-1);
    }
    char * s = (char *)shmat(shmid,nullptr,0);
    if(s == (char *)-1)
    {
        std::cout<<"shmat erro"<<std::endl;
    }
    int shmid2 = shmget((key_t)123457,128,IPC_CREAT|0600);
    if(-1 == shmid2)
    {
        std::cout<<"shmget erro"<<std::endl;
        exit(-1);
    }
    char * s2 = (char *)shmat(shmid2,nullptr,0);
    if(s2 == (char *)-1)
    {
        std::cout<<"shmat erro"<<std::endl;
    }
    std::cout<<s;
    strcpy(s2,"hello2");
    shmdt(s);
    shmdt(s2);
    exit(0);
}

结果

在这里插入图片描述
在这里插入图片描述

使用信号量进行同步

sharedmemory1.cpp

#include<iostream>
#include<stdlib.h>
#include<unistd.h>
#include<sys/shm.h>
#include"sem.h"
int main()
{
 int shmid = shmget((key_t)123456,128,IPC_CREAT|0600);
 if(shmid == -1)
 {

   std::cout<<"shmget erro"<<std::endl;
     exit(1);
 }
 char * s=(char *)shmat(shmid,NULL,0);
 if(s== (char *)-1)
 {
  std::cout<<"shmat erro"<<std::endl;
  exit(1);
 
 }
 sem_init();
  while(1)
  {
     sem_p(SEC);
     if(strncmp(s,"end",3) !=0)
     {
        std::cout<<s<<std::endl;
     }else
     {
        break;
     }
    
    sem_v(FIR);

 }
  
   shmdt(s);
   sem_destory();
}

sharedmemory2.cpp

#include<iostream>
#include<stdlib.h>
#include<unistd.h>
#include<sys/shm.h>
#include<string.h>
#include"sem.h"
int main()
{
 int shmid = shmget((key_t)123456,128,IPC_CREAT|0600);
 if(shmid == -1)
 {

     std::cout<<"shmget erro\n"<<std::endl;
     exit(1);
 }
 char * s=(char *)shmat(shmid,NULL,0);
 if(s== (char *)-1)
 {
  std::cout<<"shmat erro"<<std::endl;
  exit(1);
 
 }
 sem_init();
 while(1)
{
  char buff[128]={0};
  std::cout<<"input "<<std::endl;
  fgets(buff,127,stdin);
    sem_p(FIR);
    strcpy(s,buff);
    sem_v(SEC);
  if(strncmp(buff,"end",3) ==0)
  {
    break;
  }
}

 shmdt(s);



}

结果
在这里插入图片描述
在这里插入图片描述

ipcs -m:输出所有共享内存(share memory)信息
在这里插入图片描述
key:表示共享内存的key
shmid:表示共享内存编号
owner:表示创建共享内存的用户
perms:表示共享内存的的使用权限
bytes:表示共享内存的大小
nattch:表示连接到共享内存的的进程数
status:表示共享的状态(不显示则为正常使用,显示“dest”表示已被标记,但并未真正删除,当这块内存的引用计数为0后则会被删除)

ipcs -lm:输出共享内存(share memory)控制信息
在这里插入图片描述

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

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

相关文章

C++socket网络编程实战http服务器(支持php)(上)

TOC 第一章 Socket快速入门篇 1、TCP/IP模型 用Wireshark抓包工具来看一下上图TCP/IP模型这种4层协议里面究竟有什么内容。 在windows和Linux系统之间配置共享 首先保证我们的putty已经连接上了linux服务器&#xff0c;然后我们要安装samba这么一个目录共享工具&#xff1a…

Spark 离线开发框架设计与实现

一、背景 随着 Spark 以及其社区的不断发展&#xff0c;Spark 本身技术也在不断成熟&#xff0c;Spark 在技术架构和性能上的优势越来越明显&#xff0c;目前大多数公司在大数据处理中都倾向使用 Spark。Spark 支持多种语言的开发&#xff0c;如 Scala、Java、Sql、Python 等。…

亚马逊、OZON、速卖通等跨境电商平台卖家怎样快速提高产品权重?

亚马逊跨境电商是世界顶级的电子商务平台之一。基本上&#xff0c;当80%的客户购买产品时&#xff0c;亚马逊跨境电子商务将成为首选的在线购物平台。亚马逊是一个拥有自己独特优化算法的服务平台&#xff0c;对服务平台上数亿产品进行有序排序。当客户进行产品检索时&#xff…

【附源码】计算机毕业设计JAVA学生宿舍信息管理系统

【附源码】计算机毕业设计JAVA学生宿舍信息管理系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA…

经典排序算法JAVA实现

1、选择排序 首先在未排序数列中找到最小元素&#xff0c;然后将其与数列的首部元素进行交换&#xff0c;然后&#xff0c;在剩余未排序元素中继续找出最小元素&#xff0c;将其与已排序数列的末尾位置元素交换。以此类推&#xff0c;直至所有元素均排序完毕.复杂度为n2&#…

《Java并发编程之美》读书笔记——第一部分(并发编程基础知识)

文章目录第一章 并发编程线程基础1.什么是线程2.线程的创建与运行3.线程的通知与等待wait()wait(long timeout)wait(long timeout, int nanos)notify()与notifyAll()虚假唤醒4.等待线程执行终止的join方法5.让线程睡眠的sleep方法6.让CPU交出执行权的yield方法7.线程中断8.理解…

[附源码]java毕业设计物理中考复习在线考试系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

消息队列卡夫卡+EFLFK集群部署

pache公司的软件包官方下载地址&#xff1a;archive.apache.org/dist/ 注&#xff1a;kafka从3.0版本之后&#xff0c;不再依赖zookeeper。 一 Zookeeper概述 官方下载地址&#xff1a;archive.apache.org/dist/zookee… 1.Zookeeper定义 Zookeeper是一个开源的分布式的&a…

国内网络编译,Ambari 2.7.6 全部模块源码编译笔记

本次编译 ambari 2.7.6 没有使用科学上网的工具&#xff0c;使用的普通网络&#xff0c;可以编译成功&#xff0c;过程比 ambari 2.7.5 编译时要顺畅。 该版本相对 2.7.5 版本以来&#xff0c;共有 26 个 contributors 提交了 114 个 commits 以及修改了 557 个文件。详情见&a…

ovirt-engine通过UI Plugin自定义页面

官方API&#xff1a;点击打开 1 新增一个菜单项 1.1 创建引导html 首先你的这个页面是作为一个功能插件存在的&#xff0c;所以先给他起个名字&#xff0c;我这里的页面主要是用作用户创建&#xff0c;所以我的这个插件的名字就叫user。 接着就创建这个插件的 引导html &…

多级式多传感器信息融合中的状态估计(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

新能源车提车、上牌流程

漫长等待四个多月&#xff0c;终于2022年10月27日&#xff0c;笔者圆梦&#xff0c;喜提人生第一辆车。从选车、提车、上牌全程一人&#xff0c;用文记录下经历&#xff0c;以供参考。 一、提车流程 1.1 提车时间 若分到车&#xff0c;4S店销售会提前联系确定时间。 提示&…

【自然语言处理】【实体匹配】CollaborER:使用多特征协作的自监督实体匹配框架

CollaborER&#xff1a;使用多特征协作的自监督实体匹配框架《CollaborER: A Self-supervised Entity Resolution Framework Using Multi-features Collaboration》论文地址&#xff1a;https://arxiv.org/pdf/2108.08090.pdf 相关博客&#xff1a; 【自然语言处理】【实体匹配…

最大似然估计(机器学习)

目录 最大似然估计算法 最大似然估计例子 最大似然估计算法存在的问题 最大似然估计算法 EM算法是一种最大似然估计(Max imum Likel ihood Est imation)算法&#xff0c;传统的最大似然估计算法是根据已知的观察数据来评估模型参数 最大似然估计的一般步骤如下&#xff1a; …

HTML小游戏10 —— 休闲类游戏《解救海盗船长》(附完整源码)

&#x1f482; 网站推荐:【神级源码资源网】【摸鱼小游戏】&#x1f91f; 风趣幽默的前端学习课程&#xff1a;&#x1f449;28个案例趣学前端&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】&#x1f4ac; 免费且实用的计算机相关知…

kingbase之集群部署之集群规划和安装

一、kingbase简介 KingbaseES是一款面向大规模并发交易处理的企业级关系型数据库。该产品支持严格的ACID特性、结合多核架构的极致性能、行业最高的安全标准&#xff0c;以及完备的高可用方案&#xff0c;并提供可覆盖迁移、开发及运维管理全使用周期的智能便捷工具。在早先的博…

zsh: command not found: adb问题分析

问题描述 Mac上使用 adb 调试Android设备时&#xff0c;出现了 zsh: command not found: adb 的报错提示。 出现上述错误代表 adb 无法在挡枪 的shell 中使用&#xff0c;而当前的 shell 为 zsh 。 zsh 介绍 zsh 也是一种 shell &#xff0c;Unix 衍生系统的默认 的shell 都…

如何使用组件切换器做话题导航

highlight: atelier-cave-dark 使用组件切换器实现一个标签导航 效果展示 前置准备 背景素材 话题图标素材 具体步骤 制作背景 制作话题导航 制作话题导航结果列表 设置组件切换器关联内容 创建切换组件行为触发器 创建点击行为触发器 步骤分解 制作背景 将背景素材添加到 …

Vue使用axios进行get请求拼接参数的两种方式

前言 本文主要介绍如何在Vue使用axios进行get请求拼接参数的两种方式 我们就以github上的一个开源接口举例&#xff1a; https://api.github.com/search/users?qxxx 这是github给开发人员提供的一个接口&#xff0c;是get请求。我们可以直接通过浏览器访问 很明显&#xff…

[附源码]java毕业设计网易云音乐推荐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…