进程通信(IPC)——实现共享内存

C++ Linux IPC进程通信-共享内存 more。 阅读详情

        今天分享一下,进程通信(IPC)——实现共享内存。

       我们知道进程间通信的本质是让不同的进程看到同一内存。这之前我们用了不同的方式(管道,消息队列,信号量等等)让进程间能够通信,现在我们尝试着在内存共享区中开辟一段内存,即共享内存,让需要通信的两个进程通过页表映射到共享内存上,从而各自得到一个能映射到这段共享内存的虚拟地址的指针,进程间即可通过含有虚拟地址的指针对共享内存进行相应读写操作了。

      实现共享内存的步骤:

  1)创建共享内存(得到共享内存),使用shmget。

  2)把共享内存挂接到各自进程,使用shmat。

  3)各个进程对共享进程相应操作。

  4)使用完毕后,取消共享内存对各自进程的挂接,使用shmdt。

  5)最后,销毁共享内存,使用shmctl。注:谁创建谁销毁。


    注:若不懂使用方式man一下,直接看文档。就不详细介绍共享内存相关函数的使用了。

    由于共享内存也是随内核的,不主动释放会一直存在于内核中。所以系统有查看共享类存的相应命令,截图如下:


       由于是在内存共享区中开辟一段内存,所以共享类存的速度是进程通信所有方法中最快的,但是它的缺点是:共享内存没有自带进程的同步与互斥,所以可能会导致进程间信息冲突。所有一般情况下,共享内存都会和信号量结合在一起用,这个以后有时间会补写一个完整的,今天就这样吧!


    源代码和运行结果如下:

comm.h 

 #ifndef _COMM_H_
   #define _COMM_H_
   
   #include<stdio.h>
   #include<sys/types.h>
   #include<sys/ipc.h>
   #include<sys/shm.h>
   
   union semu{
        int val;
        struct semid_ds* buf;
        unsigned short* array;
        struct seminfo* _buf;
        };
        
  #define PATHNAME "."
  #define PROJ_ID 0X6666
 
  int GreatShm(int nums);
  int GetShm(int nums);
  int DestoryShm(int semid);
  
  #endif

ret.h   

#include"comm.h"
   
   int Common(int nums,int flags){
       key_t keys = ftok(PATHNAME, PROJ_ID);
       if(keys<0){
           perror("ftok");
           return -3;
       }
       int shmid = shmget(keys, nums, flags);
      if(shmid < 0){
          perror("shmget");
          return -1;
      }
      return shmid;
  }
  
  int GreatShm(int nums){
    return Common(nums, IPC_CREAT|IPC_EXCL);
  }
  
  int GetShm(int nums){
    return Common( nums, IPC_CREAT);
  }
  
  int DestoryShm(int shmid){
      if(shmctl(shmid, IPC_RMID, NULL)<0){
          perror("shmctl");
          return -2;
      }
      return 0;
  }
serves.c
   #include"comm.h"
   #include<unistd.h>
   
   int main(){
       int shmid = GreatShm(4096);
       printf("shmid id:%d\n", shmid);
   
       char* addr = shmat(shmid, NULL, 0);
       *addr = '\0';
  
      int i=0;
      while(i<12){
      i++;
     printf("addr:%s\n", addr);
      sleep(1);
      }
      shmdt(addr);
      DestoryShm(shmid);
  
      return 0;
  }

client.c

 #include"comm.h"
   #include<string.h>
   
   int main(){
       int shmid = GetShm(4096);
       printf("shmid id:%d\n", shmid);
       char* addr = shmat(shmid, NULL, 0);
   
       int i=0;
      while(i<8){
          addr[i] = 'a';
          i++;
          printf("addr:%s\n", addr);
          sleep(1);
      }
  
      addr[i] = '\0';
  
      shmdt(addr);
  //  DestoryShm(shmid);
      return 0;
  }

Makefile

  .PHONY:all
   all:client serve
   
   client:client.c  ret.c
       gcc -o $@ $^
   serve:serves.c ret.c
       gcc -o $@ $^
   
   .PHONY:clean
  clean:
      rm -f serve client

运行结果

 

分享如上,望大家天天有进步!还有注各位看文的小朋友,节日快乐哈!

使用共享内存实现IPC通信 共享内存的使用流程 参考博文: https://www.cnblogs.com/LiuYanYGZ/p/14292524.html 1.向内核申请一块指定大小的内存 2.如果有两个进程,需要通信,可以使用这块共享内存来完成,先创建出这两个进程。 进程A 进程B 3.进程A和进程B分别和共享内存进程关联, 拿到共享内存的地址——>首地址。 4.两个进程可以通过这个首地址对共享内存进行读/写操作。 5.如果这个进程不再使用这块共享内存,需要和共享内存断开关联。 进程退出,对共享内存是没有任何影响的。 6. 阅读详情

相关推荐

linux 进程通信——C语言实现

一.低级通信--信号通信signal.c#include #include #include /*捕捉到信号sig之后,执行预先预定的动作函数*/void sig_alarm(int sig){ printf("---the signal received is %d. /n", sig); signal(SIGINT, SIG_DFL); //SIGINT终端中断信号,SIG_DFL:恢复默认行为,SIN_IGN:忽略信号}int main(){ signal(SIGINT, sig_alarm);//捕

piaojun_pj的专栏 1万+

进程间通信IPC-共享内存

进程间通信共享内存

Hbw_aini的博客 2303

cpp-IPC是一个C库它使用Windows上的共享内存提供进程间通信

IPC是一个C 库,它使用Windows上的共享内存提供进程间通信

IPC_简单应用共享内存实现进程间通信

 --------参考文献   W.Richard Stevens, Stephen A.Rago.UNIX环境高级编程[M].北京:人民邮电出版社,2014.6:459-462. 目录 一、 共享内存 1.1 定义 1.2 方案设计 1.3 相关知识 二、 代码实现 2.1 信号量部分 2.2 写进程(留心) 2.3 读进程 一、 共享内存 1.1 定义 共享存储允许...

仰望星空 778

Kubernetes集群资源优化实战:Volcano调度器如何帮你省下30%GPU算力

本文详细介绍了如何通过Volcano调度器的Binpack策略优化Kubernetes集群中的GPU资源利用率,解决AI模型训练中的资源碎片化问题。通过实战配置和调优指南,帮助用户提升30%的GPU算力利用率,显著降低任务等待时间和硬件成本。

weixin_30832143的博客 507

曙光服务器RAID配置避坑指南:MegaRAID SAS 9361-8i实战(含Foreign状态处理)

本文详细解析了曙光服务器搭配MegaRAID SAS 9361-8i控制器的RAID配置全流程,包括RAID0和RAID5的创建、Foreign状态处理及性能优化策略。特别针对磁盘迁移中的Foreign状态问题,提供了系统化的解决方案和高级恢复技巧,助力企业级IT运维提升存储配置的稳定性和可靠性。

weixin_29200741的博客 412

Windows IPC 进程间通信之共享内存

1. 必须先创建共享内存,才能够打开 2. 关闭共享内存后,就无法打开 3. 使用Global则必须是管理员权限才能创建或打开 相当于要读写一个文件,必须先创建文件才能够打开,删掉文件后就无法打开。权限不够的话就无法读写 // share_memory.cpp : 定义控制台应用程序的入口点。 //

在线笔记 684

软件工程实验报告--用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

m0_73814332的博客 4163

Android C++ 共享内存MemoryHeapBase实现IPC进程通信实际案列

Android C++ 共享内存MemoryHeapBase实现IPC进程通信实际案列,SensorService

2359Coding 2232

3D Slicer肺部CT病灶体积测量:阈值法实操全流程

在医学影像分析中,病灶体积的精准测量是肿瘤评估、疗效随访和科研统计的重要基础。传统逐层手动勾画不仅耗时,且主观差异大,而基于CT值的阈值分割技术,通过设定灰度区间自动提取目标体素,能够快速生成三维分割结果,具有高效、可重复、边界标准统一的优势,尤其适用于肺部实性结节这类与周围肺实质对比度高的病灶。理解体素与CT值的关系,掌握阈值范围的设定逻辑,并配合连通域分析、边缘修正等工程化操作,即可在3D Slicer中稳定获得可靠的体积数据。本文从技术原理出发,系统梳理了DICOM导入、窗宽窗位调节、阈值选择、三维重

weixin_29050271的博客 251

从FinFET到GAA:手把手解读2nm芯片制造的关键技术(含BSPDN避坑指南)

本文深入解读了2nm芯片制造从FinFET向全环绕栅极(GAA)晶体管架构演进的核心技术,并重点剖析了背面供电网络(BSPDN)的三种实现路径及其工程挑战。文章旨在帮助工程师理解技术变革的内在逻辑,并为应对2nm节点设计中的关键问题提供实用指南。

weixin_29294975的博客 292

Linux通信--构建进程通信IPC的方案之共享内存|实现使用共享内存进行server&client通信

共享内存是最快的IPC形式。一旦这样的内存映射到共享它的进程地址空间,这些进程间数据传递不再涉及到内核,即进程不再通过执行进入内核的系统调用来传递彼此的数据。

jolly0514的博客 584

QGIS插件实战:用百度地图AOI数据做个城市公园分析,从下载到出图全记录

本文详细介绍了如何利用QGIS的百度地图AOI插件进行城市公园分析,从插件安装、数据获取到空间分析与可视化全流程。通过实战案例演示了公园面积统计、服务范围缓冲区分析及专题地图制作,帮助用户高效完成城市绿地评估工作。

weixin_30790841的博客 556

linux 进程通信――C语言实现

linux 进程通信――C语言实现 2010年10月15日   linux中的进程通信分为三个部分:低级通信,管道通信和进程间通信IPC(inter process communication)。linux的低级通信主要用来传递进程的控制信号--文件锁和软中断信号机制。linux的进程间通信IPC有三个部分--①信号量,②共享内存和③消息队列。以下是我编写的linux进程通信的C语言实现...

npjev02v 237

VisionPro - 基础 - 模板匹配技术-Search/PMAlign/PatMax(6)-纹理屏蔽和重叠匹配

Note:对已经有了,1已经训练好的模板,2一组使能的自由度,3一个待测的实时图片,PatMax 就能模板匹配的给出变化的最佳描述。对一些综合的模板,这三个输入值往往是一起影响最后的变换结果信息。例如,如果我们训练了一个圆形的模板,然后搜索一个角度自由度包括一个圆,那么将会有无限个可能的角度满足要求。这些组合的模板匹配,被官方名为:退化系统,a degenerate system的结果被叫做a degenerate result 退化结果4.2 退化系统例子。

山云的专栏 1534

Pyinstaller打包为可执行文件编码错误的问题

Pyinstaller打包为可执行文件编码错误的问题 写好的python程序在vscode上运行没有任何问题,将程序利用pyinstaller打包后,运行程序发生了错误。 错误代码 UnicodeDecodeError: ‘utf-8' codec can't decode byte 0xce in position 20-21:invalid cotinuation byte 网上找到的解决方案是: 1.在命令行中输入 chcp 65001 2.按正常方式进行封装 pyinstaller

xuefeng_he的博客 1560

【Linux】进程通信

进程通信,管道文件,System V系列:共享内存,消息队列,信号量

2301_81577798的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Linux---进程通信(一)---进程通信概述

本文主要介绍了进程通信的相关概念:1.为什么需要进程通信2.有哪些进程通信的手段

weixin_52042488的博客 509

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【18.3 python中的进程通信】

python中的进程通信

MITA1的博客 651

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Go语言和Python语言的IPC等通信方式-共享内存/内存映射文件/ZeroMQ和gRPC

数据结构:例如,每个传感器有一个固定大小的缓冲区(2500个float64)。排列方式:可以按照的二维数组形式存储。共享内存:提供最高性能,适合高频率、大数据量的传输,但实现复杂,尤其在跨语言环境中。内存映射文件:稍低于共享内存的性能,但更容易实现和管理。ZeroMQ 和 gRPC:提供灵活性和跨语言支持,适合各种通信模式,但性能不及共享内存,且需要额外的学习和实现工作。确定每个传感器的数据格式(例如,float64定义数据在共享内存中的存储顺序(例如,固定大小的缓冲区,按传感器ID排列)。

远方雪的专栏 1796

qt共享内存

一、说明 查看此文,共享内存,相信大家都知道进程间通信,即IPC(Inter-Process Communication),进程间通信是指两个进程的数据之间产生交互。而共享内存是实现进程通信的方式之一,其他通信方式可看下图: 查看各通信方式优缺点可访问链接,上图内容来源:进程间通讯的7种方式 应用场景分析 首先讨论一下为什么需要进程间通信?因为产品经理说项目需要。。。。。。,技术角度来说,不同的进程有自己的内存空间,正常情况下A进程是不能访问B进程的内存空间的。可是一些大型项目,因为项目业务比较复杂,于是

weixin_42887343的博客 7031

Linux:进程间通信---命名管道&&共享内存

类似于与open中的位图参数,表示,如何创建,如何获取概念。是一个共享内存标识符(该返回值和文件描述符并不能类比)是创建的共享内存的大小(问题一),单位是字节。

知北游天的博客 2299

操作系统学习(四)——进程通信

进程通信(Inter-Process Communication, IPC)是操作系统中的重要机制,它允许多个进程交换数据、同步行为或协同工作,在现代多任务系统、客户端-服务器模型以及并发编程中非常关键。 因为进程拥有独立的地址空间,一个进程无法直接访问另一个进程的数据,因此需要专门的通信机制来完成: 数据交换(如客户端与服务器); 资源共享(如日志服务); 事件通知(如唤醒子进程); 进程同步(如互斥执行)。

weixin_45857378的博客 1124

linux应用基础知识点14-IPC之共享内存

linux应用基础知识点14-IPC之共享内存 用共享内存实现进程间通信,可以省却文件向进程的读取、修改、写回一系列繁琐的操作。而是直接可对该内存空间进行修改。 相关函数 POSIX和System V均提供了共享内存的实现函数,Linux将两种实现方式均吸纳为己所用。 POSIX的函数:shm_open mmap munmap ftruncate SystemV的函数:shmget shmat s...

weixin_38657795的博客 261

【Linux】Linux进程通信与System V IPC机制

Linux进程通信基本概念 从原理上来看,进程通信的关键技术就是在进程间建立某种共享区,利用进程都可以访问共享区的特点来建立一些通信通道。如下图所示: 其实,以前设计程序时使用的全局变量,就是一种可以在各个函数之间进行通信的手段,它所占用的内存空间就是程序中各个函数的共享区。但那时,由于各个函数都同属于一个进程,因此没有进程空间的障碍。所以,解决进程之间通信的就在于如何突破进程空间的障碍。...

Yngz_Miao的博客 9495
上一篇: 进程通信(IPC)——实现信号量
下一篇: 线程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值