Linux进程间的通信(四)System-V共享内存

news2024/11/18 13:37:20

什么是共享内存

        共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。

        不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。

        如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。

共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取,所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量。

关于信号量的知识,将在线程安全中介绍

共享内存和消息队列各个参数:

 

共享内存api

分配一块共享内存

#include <sys/ipc.h>
#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);

key:密钥 
size: 共享内存的大小  必须是 PAGE_SIZE 整数倍 ,getconf PAGE_SIZE  查看大小
shmflg: 权限 
              IPC_CREAT 创建 
              IPC_EXCL 检查是否存在 

返回值:  成功 共享内存对象
              失败  -1


映射共享内存

#include <sys/types.h>
#include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);

shmid:共享内存对象id 
shmaddr:填写为NULL ,系统自动选择映射地址 
shmflg:属性默认为  0  
返回值:  
映射成功 返回指向共享内存的指针 
              映射失败  (void *) -1
 

int shmdt(const void *shmaddr); //解除映射


控制共享内存

#include <sys/ipc.h>
#include <sys/shm.h>

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

cmd参数见上一篇消息队列

销毁共享内存

shmctl(shmid,IPC_RMID,NULL);


创建一个共享内存,通过键盘往内存中写入数据

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    //1.创建密钥
   key_t  key= ftok("/home",120);


   //2.创建共享内存对象 
   int shmid = shmget(key,4096,IPC_CREAT|0777);
    if(shmid < 0)
    {
        perror("创建共享内存失败\n");
        return -1;
    }else 
    {
        printf("创建共享内存成功\n");
    }


    //3.映射共享内存  
    char *p = shmat(shmid,NULL,0);

    while (1)
    {
       //4.从键盘获取数据到共享内存中 
         scanf("%s",p);
    }
    
}

 

创建一个共享内存,不断读取共享内存中的数据

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    //1.创建密钥
   key_t  key= ftok("/home",120);


   //2.创建共享内存对象 
   int shmid = shmget(key,4096,IPC_CREAT|0777);
    if(shmid < 0)
    {
        perror("创建共享内存失败\n");
        return -1;
    }else 
    {
        printf("创建共享内存成功\n");
    }


    //3.映射共享内存  
    char *p = shmat(shmid,NULL,0);

    while (1)
    {
       printf("%s\n",p);
       sleep(1);
    }
    
    getchar();
}

 参考:进程间通信——共享内存(Shared Memory)_进程间通讯 共享内存-CSDN博客

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

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

相关文章

深度学习后门攻击分析与实现(二)

前言 在本系列的第一部分中&#xff0c;我们已经掌握了深度学习中的后门攻击的特点以及基础的攻击方式&#xff0c;现在我们在第二部分中首先来学习深度学习后门攻击在传统网络空间安全中的应用。然后再来分析与实现一些颇具特点的深度学习后门攻击方式。 深度学习与网络空间…

Node.js安装Express,Node.js支持Typescript以及Express支持Typescript的步骤

1. Node.js 安装Express 运行如下命令&#xff1a; $ mkdir express-demo $ cd express-demo$ npm install express $ npm install body-parser //(可选)中间件&#xff0c;用于处理 JSON, Raw, Text 和 URL 编码的数据 $ npm install cookie-parser //(可选)通过req.cookies…

怎么用gitee做一个图片仓库,在md文档中用这个图片网络地址,然后显示图片

痛因&#xff1a;我为什么要这样做&#xff0c;呃&#xff0c;我一开始图片都是存本地地址的&#xff0c;放在和这个md文档同级的assets文件夹下面&#xff0c;这样子确实当时很方便&#xff0c;复制粘贴什么也不用管&#xff0c;但是想把这个文档分享给别的人的时候&#xff0…

Windows打开HDF5图像:HDFView软件的下载、安装

本文介绍在Windows电脑中&#xff0c;下载、安装用以查看HDF5图像数据的软件HDFView的方法。 HDF5&#xff08;Hierarchical Data Format 5&#xff09;是一种用于存储和管理大量科学数据的文件格式&#xff0c;其由HDF Group开发和维护&#xff0c;广泛应用于科学计算、工程、…

ESP8266wifi模块的使用

文章目录 概要整体架构流程技术名词解释具体配置过程小结 概要 本文旨在介绍ESP8266,做为客户端 电脑做为服务端&#xff0c;通过TCP/IP协议在同一个局域网下通过WiFi进行数据交互 设备选用 esp8266 软件选择 安信可串口调试助手 网络调试助手 &#xff08;若没有软件可私…

OpenCV threhold()函数

OpenCV threhold()函数的主要用途是将灰度图转换为二值图像,实现灰度图的二值化&#xff0c;在机器视觉中使用频度较高&#xff0c;如尺寸量测&#xff0c;物体识别等。其原型如下&#xff1a; 函数参数&#xff1a; src 输入数组&#xff08;多通道、8 位或 32 位浮点&#xf…

SpringBoot3脚手架

MySpringBootAPI SpringBoot3脚手架&#xff0c;基于SpringBoot3DruidPgSQLMyBatisPlus13FastJSON2Lombok&#xff0c;启动web容器为Undertow(非默认tomcat)&#xff0c;其他的请自行添加和配置。 <java.version>17</java.version> <springboot.version>3.3…

项目集成SpringSecurity框架

目录 项目没集成SpringSecurity框架的实现 项目之前的登录接口 LoginReqVo 接收前端的数据类型 LoginRespVo返回给前端的数据 项目集成SpringSecurity 第一步:导入依赖 第二步:创建security包结构 第三步&#xff1a;实现认证过滤器 第一步&#xff1a;自定义认证过滤器…

Modbus调试工具和源码分享

我们应该知道了学习Modbus协议应该具备主从两个设备才行&#xff0c;但是在学习过程中如果没有真实的物理设备&#xff0c;应该怎么调试呢&#xff1f; 我们可以通过软件工具来模拟主从设备&#xff0c;下面我们推荐几个比较实用的工具。 以下内容包含&#xff1a;实用工具、…

超好用的10款视频剪辑软件,从入门到精通

视频剪辑软件哪款比较好呢&#xff1f;无论是专业制作团队、自媒体创作者&#xff0c;还是家庭用户&#xff0c;一款好用的视频剪辑软件都能极大地提升创作效率和作品质量。以下是十款备受推崇的视频剪辑软件&#xff0c;分别从适用人群、易用程度和功能特点进行介绍。 1.影忆…

揭秘移动硬盘RAW:原因、恢复策略与预防措施

移动硬盘RAW概述 移动硬盘&#xff0c;作为现代数据存储的重要工具&#xff0c;其稳定性与数据安全直接关乎用户的数据资产安全。然而&#xff0c;在使用过程中&#xff0c;不少用户会遇到移动硬盘状态突然变为RAW格式的情况&#xff0c;这往往伴随着数据无法直接访问的困扰。…

1688客服代码怎么做生成悬浮客服代码阿里巴巴国内站1688平台悬浮特效悬浮代码悬浮客服 1688客服代码怎么做生成器软件代码工具制作客服代码阿里巴巴

阿里巴巴国内站1688平台悬浮特效悬浮代码悬浮客服 1688客服代码怎么做生成器软件代码工具制作客服代码阿里巴巴 一秒美工工具

王道-操作系统

3 下列说法正确的是_____ 答案:A 解析: A 正确。如链接文件可以顺序存取,但不能随机存取。连续文件可随机存取,也可顺序存取。 B 错误。一个 FCB 就是一个文件目录项。在引入索引节点后,每个文件的目录项只保留文件名和指向该文件对应的索引节点指针,而索引节点的有关信息…

一书直接讲透自然语言处理《Getting Started with Google BERT_ Build and train》

《Getting Started with Google BERT: Build and Train》是一本面向初学者和中级读者的指南&#xff0c;旨在帮助他们理解和使用Google的BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;模型。BERT是近年来自然语言处理&#xff08;NLP&…

WIFI密码默认显示

文章目录 需求分析遇到问题问题原因解决方案 需求 在进入设置&#xff0c;点击某一个wifi,连接wifi 界面&#xff0c;显示密码默认选中状态&#xff0c;效果如下 分析 在 WiFi密码被输入法挡住 中我们已经分析了整个流程&#xff0c;布局文件和控制中心。 结局系统设置WIFI连…

9.29总结

这星期学了概率和组合数学 这是我觉得的一个有趣的题目&#xff0c;每个人身上都有n-1根绳子&#xff0c;如果组不成稳定三角&#xff0c;那么肯定有两个人相邻两根绳子颜色不一样&#xff0c;那么每两个这样的人就会贡献一个不稳定三角形&#xff0c;所以只要所有三角形减去每…

Linux 进程间通信(共享内存+消息队列)

目录 一.共享内存 1.底层原理和系统接口 a.底层原理 b.系统接口 ① shmget ② shmat ③ shmdt ④ shmctl c.命令行控制指令 2.共享内存的通信特点 a.共享内存间的通信没有任何的同步机制 b.共享内存是所有进程间通信速度最快的 c.共享内存可以提供较大的空间。 3…

网络游戏通信方案概述

弱联网和强联网游戏 长连接和短连接游戏 Socket、Http、FTP 总结

亚马逊AI编程工具Amazon Q 和 Amazon CodeWhisperer使用教程

Amazon CodeWhisperer 主要功能&#xff1a;用于代码生成和编程辅助。它可以在 IDE 中提供代码建议、自动补全代码、生成代码片段等。使用场景&#xff1a;主要用于开发者在编写代码时提高效率&#xff0c;减少重复性工作。特点&#xff1a;支持多种编程语言&#xff0c;集成在…

composer环境变量(phpstudy集成环境)无法使用问题

composer 不是内部或外部命令,也不是可运行的程序 或批处理文件。 按下WinR组合键打开“运行”&#xff0c;输入sysdm.cpl 回车&#xff0c;打开“系统属性”并切换至“高级”选项卡&#xff0c;点击“环境变量”进行配置 配置完后点击确定&#xff0c;重新打开命令行&#x…