【Linux】System V IPC-命名管道共享内存消息队列

System V IPC-命名管道&共享内存&消息队列

  • 命名管道
  • 共享内存
    • 创建共享内存
    • 附加和分离共享内存
  • 消息队列
    • 消息队列的接口

命名管道

使用mkfifo命令,创建一个命名管道,通过ll可以查看当前命名管道的类型
在这里插入图片描述
p类型,也就是pipe管道类型。

之前我们说,匿名管道是没有名字的,只能用于有亲缘性的进程之间进行通信,而命名管道,由于有自己的名字,所以可以通过名字来找到这个管道,因此没有亲缘性的要求了。

匿名管道命名管道
是通过内核提供的通道实现通过文件系统实现
通过pipe打开,打开文件描述符通过mkfifo打开
无需创建空间需要手动通过mkfifo创建管道
要求亲缘性进程之间没有亲缘性要求
生命周期随着进程结束而终止生命周期同操作系统

共享内存

共享内存的原理是:在物理内存中开辟一段空间,不同的进程通过页表将物理内存空间映射到自己的进程虚拟地址空间中,不同的进程通过操作自己的进程虚拟地址空间来操作共享内存。

在这里插入图片描述
了解原理之后,我们需要知道如何创建共享内存,以及如何附加和分离共享内存到进程中。

创建共享内存

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

功能:用来创建共享内存
参数
key:这个共享内存段名字,0(IPC_PRIVATE)会创建新的共享内存对象
size:共享内存大小
shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
返回值:成功返回一个非负整数,即该共享内存段

附加和分离共享内存

附加:

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

功能:将共享内存段连接到进程地址空间
参数
shmid: 共享内存标识
shmaddr:指定连接的地址,一般传NULL,让操作系统分配
shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回一个指针,指向共享内存第一个地址;失败返回-1

分离:

 int shmdt(const void *shmaddr);

功能:将共享内存段与当前进程脱离
参数
shmaddr: 由shmat所返回的指针
返回值:成功返回0;失败返回-1
注意:将共享内存段与当前进程脱离不等于删除共享内存段

操作共享内存:

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

功能:用于控制共享内存
参数
shmid:由shmget返回的共享内存标识码
cmd:将要采取的动作(有三个可取值)(IPC_RMID)删除共享内存,(IPC_SET)设置共享内存属性信息,(IPC_STAT)获取共享内存属性信息
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
返回值:成功返回0;失败返回-1

共享内存有一些特性:
1.共享内存的生命周期是跟随操作系统的
2.进程对共享内存进行写的时候是覆盖写,读的时候是访问地址:也就是覆盖写,访问读
3.(重点)要删除共享内存时,有一些删除特性。

使用ipcs -m 可以查看当前的共享内存信息
在这里插入图片描述

要删除共享内存,除了使用shmctl,设置cmd为IPC_RMID,还可以使用命令删除ipcrm -m 共享内存操作句柄
在这里插入图片描述

其实在删除的时候是分两种情况的:
1.删除的时候没有进程附加到这个共享内存,那么就会直接将当前的共享内存删除,并且在内核中描述当前共享内存的结构体也被释放了。
2.当前共享内存的附加进程不为0,会将当前共享内存的key设为0x00000000,,表示当前共享内存不能被其他进程所附加,共享内存的状态被设置为destory。一旦当前共享内存的附加进程为0,当前共享内存在内核中的结构体就会被释放。

在这里插入图片描述

消息队列

消息队列的原理:
在这里插入图片描述

采用链表来实现消息队列,该链表是由系统内核维护的。系统中可能存在多个消息队列,每个消息队列都有自己的消息队列描述符(消息队列ID),区分不同的消息队列。
在进行进程间通信时,一个进程将消息队列添加到尾端,另一个进程从消息队列中取出消息(并不一定是以先进先出的方式,也可以按照消息类型字段先进先出)

消息队列的接口

创建消息队列:

int msgget(key_t key, int msgflg);

参数:
key表示消息队列的标识符
msgflg:创建的标志,例如IPC_CREATE | 权限
返回值:
创建成功队列的ID,创建失败返回-1

发送消息:

int msgsnd(int msgid, const void* msgp, size_t msgsz, int msgflg);

参数:
msgid:消息队列id
msgp:指向msgbuf的指针,用来指定发送的信息
msgsz:发送信息的长度
msgflg:创建标记,如果指定IPC_NOWAIT(非阻塞), 失败会立刻返回
返回值:
成功返回0,失败返回-1

接收消息:

ssize_t msgrcv(int msgid, void* msgp, size_t msgsz, long msgtyp, int msgflg);

参数:
msgid:消息队列id
msgp:指向msgbuf的指针,用于接收消息
msgsz:接收消息的长度
msgtyp接收消息的方式
msgtyp=0:直接读取队列中第一条消息
msgtyp>0,读取队列类型中msgtyp类型的第一条消息(如果在msgflg中设置了MSG_EXCEPT,则按照前面的方式出队,如果没有设置,则出的是msgtyp之外类型的第一条消息)
msgtyp<0,读取队列类型中小于或等于msgtyp绝对值的第一条消息
msgflg:创建标记,如果指定IPC_NOWAIT,则失败会立刻返回

返回值:
成功返回0,失败返回-1

操作消息队列的接口:

int msgctl(int msgid, int cmd, struct msgid_ds* buf);

参数:
msgid:消息队列id
cmd:控制命令,可以设置为IPC_RMID(删除消息队列),IPC_STAT(获取消息队列状态)
buf:存储消息队列的相关信息的buf
返回值:
成功根据不同cmd返回不同值,失败返回-1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vector - CAPL - Panel面板_01

前面有过简单的介绍panel面板的功能&#xff0c;不过终究感觉有点简陋&#xff0c;最近也在搞PyQT5&#xff0c;发现如果对于这块了解不多的情况下&#xff0c;想要做一些东西的话&#xff0c;简直无从下手&#xff0c;因此专门翻阅了之前的文章&#xff0c;查看了下确实缺少了…

json for modern c++

目录 json for modern c概述编译问题问题描述问题解决 读取JSON文件demo json for modern c GitHub - nlohmann/json: JSON for Modern C 概述 json for modern c是一个德国大牛nlohmann写的&#xff0c;该版本的json有以下特点&#xff1a; 1.直观的语法。 2.整个代码由一个…

机器学习——L1范数充当正则项,让模型获得稀疏解,解决过拟合问题

问&#xff1a;使用L2范数正则项比L1范数正则项得到的是更为稀疏的解。 答&#xff1a;错误&#xff0c;L1范数正则项得到的是更稀疏的解。因为在L1正则项中&#xff0c;惩罚项是每个参数绝对值之和&#xff1b;而在L2正则项中&#xff0c;惩罚项是每个参数平方的和。L1正则项…

( “树” 之 DFS) 111. 二叉树的最小深度 ——【Leetcode每日一题】

111. 二叉树的最小深度 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a; 叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2…

Nginx 正向代理、方向代理、端口转发

正向代理就是客户端代理&#xff0c;代理客户端&#xff0c;服务端不知道实际发起请求的客户端 正向代理中&#xff0c;proxy和client一般同一个lan或者网络可达&#xff0c;server与client一般不可达&#xff08;缓存场景除外&#xff09; 正向代理类似一个跳板机&#xff0c…

java异常

下面是算术异常。 抛出的异常其实是个类。 下面是空指针异常。 用异常时&#xff0c;下面语句不会执行。 上面这些是运行时异常 下面这是编译时异常。 在程序编译期间发生的异常&#xff0c;称为编译时异常&#xff0c;也称为受检查异常 在程序执行期间发生的异常&#xff0c;…

企业信息化建设该怎么做?方向和手段都在这了

企业信息化建设该怎么做&#xff1f; 如果现在是十年前&#xff0c;我一定会说&#xff0c;做信息化需要寻找熟悉不同编程语言、有经验的程序员。 但是现在&#xff0c;如果不是特别复杂的信息化系统&#xff0c;其实公司完全可以使用零代码平台自主开发&#xff0c;不需要再…

TryHackMe-Year of the Jellyfish(linux渗透测试)

Year of the Jellyfish 请注意 - 此框使用公共 IP 进行部署。想想这对你应该如何应对这一挑战意味着什么。如果您高速枚举公共 IP 地址&#xff0c;ISP 通常会不满意… 端口扫描 循例nmap 扫描结果中还有域名&#xff0c;加进hosts FTP 枚举 尝试anonymous Web枚举 有三个端…

Open Inventor 2023.1 Crack

发行说明 Open Inventor 2023.1&#xff08;次要版本&#xff09; 文档于 2023 年 4 月发布。 此版本中包含的增强功能和新功能&#xff1a; Open Inventor 10 版本编号更改体积可视化 单一分辨率的体绘制着色器中与裁剪和 ROI 相关的新功能MeshVizXLM 在 C 中扩展的剪辑线提…

[网络安全]第三次作业

目录 1. 什么是IDS&#xff1f; 2. IDS和防火墙有什么不同&#xff1f; 3. IDS工作原理&#xff1f; 4. IDS的主要检测方法有哪些详细说明&#xff1f; 5. IDS的部署方式有哪些&#xff1f; 6. IDS的签名是什么意思&#xff1f;签名过滤器有什么作用&#xff1f;例外签名…

SpringBootApplication最详细注解

SpringBootApplication最详细注解 SpringBootApplication的注解分类1.Target 2.Retention3.Document 4.Inherited5.SpringBootConfiguration 6.EnableAutoConfiguration6.1AutoConfigurationPackage这个注解6.1.1 Import6.1.2 AutoConfigurationpackages.Registrar.class 6.2 A…

经营软件公司五年,从外包到SaaS的踩坑笔记

文章目录 摘要开公司的两个误区关于管理关于合作关于SaaS其他经验大和强是两码事。大不是目的&#xff0c;强才是。小步试错、慢慢迭代不要掉入流量陷阱 摘要 经营公司已有五年&#xff0c;经历了三年的疫情停滞&#xff0c;现在正在转型为一家SaaS公司。虽然曾经迷茫过&#…

【虹科案例】固态量子发射器——虹科数字化仪用于控制钻石色心中的脉冲序列

前言 钻石的色心是晶格中的缺陷&#xff0c;其中碳原子被不同种类的原子取代&#xff0c;相邻的晶格位置是空的。由于其明亮的单光子发射和光学可访问的自旋&#xff0c;色心可以成为未来量子信息处理和量子网络的有前途的固态量子发射器。 实现自旋量子比特和相干光子纠缠的两…

Linux DHCP服务

DHCP 作用 DHCP动态主机配置协议作为服务端负责集中给客户端分配各种网络地址参数(主要包括IP地址、子网掩码、广播地址、默认网关地址、DNS服务器地址) 传输协议端口 服务端 UDP 67端口 客户端 UDP 68端口 工作原理 1) 客户端广播发送DISCOVER报文寻找服务端 2) 服务端广播发…

5G物理层信道pdcch说明(留档)

网络七层协议OSI是一个开放性的通信系统互连参考模型。 它是国际标准组织制定的一个指导信息互联、互通和写作的网络规范。 开放&#xff1a;是指只要遵循OSI标准&#xff0c;位于世界的任何地方的任何系统之间都可以进行通讯&#xff1b;开放系统&#xff1a;是指遵循互联网协…

MBD—模型的回调函数

目录 前面 如何设置&#xff1f; 应用 简单的提示 数据的初始化 前面 常用的回调函数有三类&#xff1a;模型的回调函数、模块的回调函数、信号的回调函数。这里分享一下模型的回调函数。 回调函数就是CallBack. 如何设置&#xff1f; 打开一个模型&#xff0c;在空白…

论文阅读【17】Dynamic ensemble learning for multi-label classification

论文十问十答&#xff1a; Q1论文试图解决什么问题&#xff1f; Q2这是否是一个新的问题&#xff1f; Q3这篇文章要验证一个什么科学假设&#xff1f; Q4有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课题在领域内值得关注的研究员&#xff1f; Q5论文中提到的解决方…

简述API(电商数据API)网关的概念和功能

API 网关 ( API gateway ) 前言 在 IOT &#xff08; 物联网 &#xff09;中&#xff0c;当我们的一些设备。例如&#xff08; 监控、传感器等 &#xff09;需要将收集到的数据和信息进行汇总时&#xff0c;我们就需要一个 API。&#xff08;如果你需要Taobao/JD/pinduoduo平台…

Replicator简介

Replicator 文章目录 ReplicatorReplicator简介合成数据训练背后的理论Replicator核心组件已知的问题 Replicator简介 Omniverse Replicator 是一个高度可扩展的框架&#xff0c;构建在可扩展的 Omniverse 平台上&#xff0c;可生成物理上准确的 3D 合成数据&#xff0c;以加速…

OpenAI-ChatGPT最新官方接口《语音智能转文本》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(六)(附源码)

Speech to text 语音智能转文本 Introduction 导言Quickstart 快速开始Transcriptions 转录python代码cURL代码 Translations 翻译python代码cURL代码 Supported languages 支持的语言Longer inputs 长文件输入Prompting 提示其它资料下载 Speech to text 语音转文本 Learn how…