【Linux】system V进程间通信--共享内存,消息队列,信号量

目录

共享内存

基本原理

创建共享内存

共享内存创建好后,我们可以查询共享内存,验证一下是否创建成功;

删除共享内存

共享内存的挂接

实现通信

消息队列(了解)

消息队列概念

消息队列接口

操作指令

信号量(了解)

信号量概念

理解信号量

信号量操作


通信的方式有三种:聚焦本地通信的System V,实现跨主机之间的通信POSIX,以及基于文件系统的管道通信

下面是System V的通信方式:

system V IPC提供的通信方式有三种: 共享内存、消息队列、信号量;并且生命周期是随OS的,而不是随进程的,这是所有System V进程间通信的共性;

共享内存

共享内存=内存空间(数据)+共享内存的属性!!!

基本原理

共享内存:通过让不同的进程,看到通过一个内存块的方式就叫共享内存;

我们把创建好的内存称为共享内存;进程和共享内存建立映射关系称为挂接;取消进程和共享内存的映射关系称为释放内存空间;

  • 创建共享内存

这里我们用的是shmget来创建共享内存;

size:要创建的共享内存的大小;

shmflg:标识符,IPC_CREAT ,IPC_EXCL;

  1. IPC_CREAT:如果创建的shm不存在,则创建;反之,则获取该内存并返回(总能获取一个shm);
  2. IPC_EXCL:单独使用没有意义;
  3. IPC_CREAT | IPC_EXCL:如果创建的shm不存在,则创建;反之,则出错返回;(意味着shm是全新的);

key:用户形成(唯一性的);保证看到同一份共享内存,能进行唯一性标识。如何形成?ftok

  • pathname:路径
  • proj_id:标识符

创建共享内存要先创建出key,在创建内存:

  1. key_t key = ftok(_path.c_str(), _proj_id);if (key < 0){perror("ftok");}return key;
  2. int Shmget(key_t key,int size, int flag){int shmid = shmget(key, size, flag);if (shmid < 0){perror("shmget");}return shmid;}

共享内存创建好后,我们可以查询共享内存,验证一下是否创建成功;

查询共享内存:ipcs -m

删除共享内存

 删除共享内存:ipcrm -m +shmid

shmid:创建共享内存的返回值;

cmd:通常为IPC_RMID;

buf:用于存储共享内存的信息;

key VS shmid

  • key:用户形成,内核使用的一个字段,用户不能使用key来进行shm的管理,内核进行区分shm的唯一性的(类比于struct file来理解);
  • shmid:内核给用户返回的一个标识符,用来进行用户级对共享内存进行管理的id值(类比于fd来理解);

共享内存的挂接

  • shmat:关联共享内存
  • shmdt:去关联

shmaddr:指定虚拟地址,但是我们并不了解,直接设置为nullptr即可;shmflg:读取权限,默认为0

  1.     void *Attachshm(){void * shmaddr=shmat(_shmid,nullptr,0);if(shmaddr==nullptr){perror("shmat");}cout<<"who: "<<_who<<"   attach shm..."<<endl;return shmaddr;}
  2. void deleteshm(void * shmaddr){if(shmaddr==nullptr)return ;int res = shmdt(shmaddr); }

这样我们就完成的通信前的准备工作;

实现通信

我们把准备工作完成后,通信过程就比较简单了;因为共享内存是一段内存,我们在访问一个内存时,如果权限够的话,可以直接进行读取和写入;

不管我们运行代码时会发现一个问题就是我们的内容还没有写完,就会被读取;这是因为共享内存不提供对共享内存的任何保护机制  ----->数据不一致问题;

怎么解决这个问题???

我们只需要引入管道即可解决;

共享内存是所有进程间通信速度是最快的,因为共享内存是被双方所共享,只要写入对方就能立即看到,能大大减少数据的拷贝次数。

消息队列(了解)

消息队列概念

        消息队列是OS提供的内核级队列,消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法,每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值

消息队列接口

  • msgget:获取消息队列

  • msgctl:控制消息队列

  • msgsnd:发送消息
  • msgrcv:读取消息

操作指令

ipcs -q

ipcrm -q +msgid

信号量(了解)

信号量概念

理解信号量

信号量、信号灯  ------->保护临界资源(code)

类比于去电影院看电影,人们必须要买票才能进去看电影;

  • 电影院:共享资源(临界资源);
  • 买票:申请信号量;
  • 票数:信号量的初始值;

申请信号量本质 就是对公共资源的预定机制;

信号量的本质是一个计数器,通常用来表示公共资源中,资源数的多少问题。信号量主要用于同步和互斥的。

既然信号量本质是一个计数器,那么可以用一个全局变量来代替吗?

不行,全局变量不能让所有进程都能看到,而且count++/count--不是原子的;

信号量操作

  • semget:申请信号量

  1. nsems:申请信号量的个数
  2. semflg:IPC_CREAT ,IPC_EXCL;

  • semctl:删除信号量

  1. semid:semget的返回值;

  • semop:信号量操作

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

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

相关文章

从MySQL到OceanBase离线数据迁移的实践

本文作者&#xff1a;玉璁&#xff0c;OceanBase 生态产品技术专家。工作十余年&#xff0c;一直在基础架构与中间件领域从事研发工作。现负责OceanBase离线导数产品工具的研发工作&#xff0c;致力于为 OceanBase 建设一套完善的生态工具体系。 背景介绍 在互联网与云数据库技…

番外篇 | 史上最全的关于CV的一些经典注意力机制代码汇总

前言:Hello大家好,我是小哥谈。注意力是人类认知系统的核心部分,它允许我们在各种感官输入中筛选和专注于特定信息。这一能力帮助我们处理海量的信息,关注重要的事物,而不会被次要的事物淹没。受到人类认知系统的启发,计算机科学家开发了注意力机制,这种机制模仿人类的这…

鸿蒙跨设备协同开发04——跨设备剪切板开发

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、概述 当用户拥有多台设备时&#xff0c;可以通过跨设备剪贴板的功能&#xff0c…

2. MySQL数据库基础

一、数据库的操作 1. 显示当前的数据库 SHOW DATABASES;2. 创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification...];//create_specification包括&#xff1a;[DEFAULT] CHARACTER SET charset_name[DEFAULT] COLLATE collation_n…

【题解】【记忆化递归】——Function

【题解】【记忆化递归】——Function Function题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示数据规模与约定 1.思路解析2.AC代码 Function 通往洛谷的传送门 题目描述 对于一个递归函数 w ( a , b , c ) w(a,b,c) w(a,b,c) 如果 a ≤ 0 a \le 0 a≤0 或 b ≤…

2025年广西高考报名流程图解(手机端)

广西 2025 年高考报名时间已经确定啦&#xff0c;从 2024 年 10 月 21 日开始&#xff0c;到 10 月 31 日 17:30 结束 &#x1f4bb;【报名路径】 有电脑端和手机端两种选择哦。 电脑端&#xff1a;登录 “广西招生考试院” 网站&#xff08;https://www.gxeea.cn&#xff0…

SQL数据库刷题sql_day34(移动平均值、累计求和)

描述 移动平均值 1.求不同产品 每个月以及截至当前月最近3个月的平均销售额 2.求不同产品截至当前月份的累计销售额 数据准备 mysql CREATE TABLE sales_monthly (product VARCHAR(20),ym VARCHAR(10),amount DECIMAL(10,2) );-- 插入测试数据 INSERT INTO sales_monthly (prod…

厨房老鼠数据集:掀起餐饮卫生监测的科技浪潮

厨房老鼠数据集&#xff1a;掀起餐饮卫生监测的科技浪潮 摘要&#xff1a;本文深入探讨了厨房老鼠数据集在餐饮行业卫生管理中的重要性及其相关技术应用。厨房老鼠数据集通过收集夜间厨房图像、老鼠标注信息以及环境数据&#xff0c;为深度学习模型提供了丰富的训练样本。基于…

目前我国网络安全人才市场状况

网络安全人才市场状况 本章以智联招聘多年来形成的丰富的招聘、求职信息大数据为基础&#xff0c;结合了奇安信集团 在网络安全领域多年来的专业研究经验&#xff0c;相关研究成果具有很强的代表性。对涉及安全人才 的全平台招聘需求与求职简历进行分析&#xff08;注&#xf…

Ajax(web笔记)

文章目录 1.Ajax的概念2.Ajax 的作用3.原生Ajax4.Axios4.1Axios的概念4.2Axios入门 1.Ajax的概念 AsynchronousJavaScriptAndXML&#xff0c;异步的JavaScript和XML 2.Ajax 的作用 数据交换:过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互:可以在…

小猿口算辅助工具(nodejs版)

github 地址&#xff1a;https://github.com/pbstar/xyks-helper 实现原理 通过屏幕截图截取到题目区域的两个数字&#xff0c;然后通过 ocr 识别出数字&#xff0c;最后通过计算得出答案&#xff0c;并通过模拟鼠标绘制答案。 依赖插件 node-screenshots&#xff1a;屏幕截…

ai搜索工具免费的有那些?这几年搜索都发生了哪些变化?

前言这几年大家的搜索都发生了哪些变化&#xff1f; 要说疯狂的就属于AI工具了&#xff0c;以前搜索内容有广告自己只能眼巴巴的看着&#xff0c;现在不少人的搜索行为都有所变化&#xff0c;经过自己测试也给大家推荐一些自己使用的AI搜索工具毕竟免费。AI对传统搜索影响在传…

linux 虚拟环境下源码安装DeepSpeed

第一步&#xff1a;创建虚拟环境&#xff1a; conda create -n deepspeed python3.10 第二步&#xff1a;进入虚拟环境&#xff0c;安装Pytorch 2.3.1 # CUDA 12.1 conda install pytorch2.3.1 torchvision0.18.1 torchaudio2.3.1 pytorch-cuda12.1 -c pytorch -c nvidia 第…

测试教程分享

前几年在腾讯课堂上发布了不少课程&#xff0c;后来腾讯课堂改革&#xff0c;要收会员费&#xff0c;课程还要抽提程&#xff0c;这么下来就相当于白干了。就放弃了在上面发课程&#xff0c;再后来腾讯课堂就关闭了&#xff0c;以前发布的视频就没有地方发了&#xff0c;于是我…

Android MQTT调试助手开发

在Android开发中&#xff0c;与远程服务器进行通信是一个常见的需求。MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的、基于发布/订阅模式的消息传输协议&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;场景中。在阿里云物联网平台…

张雪峰谈网络安全专业前景广阔,现状惨不忍睹

张雪峰在谈论网络安全专业时&#xff0c;主要强调了该专业的就业前景、适应岗位、以及部分高校在此领域的优势。以下是他的观点归纳&#xff1a; 张雪峰对网络安全专业的观点 就业前景广阔 网络空间安全专业的就业前景非常广阔。随着信息时代的到来&#xff0c;各类企业和组织…

Q2=17.8和w=0.6198情况

&#xff08;个人学习笔记&#xff0c;仅供参考&#xff09; import numpy as np from scipy.special import kv, erfc from scipy.integrate import dblquad import matplotlib.pyplot as plt import scipy.integrate as spiw 0.6198 g0_sq 21.5989 rho 0.782908 Q2 17.8…

KubeSphere v4 安装指南

日前&#xff0c;KubeSphere v4 发布&#xff0c;相较于之前的版本&#xff0c;新版本在架构上有了颠覆性的变化。为了让社区的各位小伙伴能够丝滑的从旧版本过渡到新版本&#xff0c;我们特别推出本篇安装指南文章&#xff0c;以供参考。 关于 KubeSphere v4 的介绍&#xff…

一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景

文章目录 一、常用数据库概览1.1 关系型数据库1.2 非关系型数据库1.2.1 KV数据库1.2.2 文档型数据库1.2.3 列式存储数据库1.2.4 图数据库 1.3 SQL与NoSQL区别1.3.1 结构化与非结构化1.3.2 关联和非关联1.3.3 查询方式1.3.4 事务1.3.5 总结 二、MySQL三、PostgreSQL3.1 特点、适…

基本计算器 II

文章目录 题目解析解题小结 题目解析 给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意&#xff1a;不允许使用任何将字符…