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

news2025/6/21 1:11:35

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

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

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

相关文章

Docker镜像之Docker Compose讲解

文章目录1 docker-compose1.1 compose编排工具简介1.2 安装docker-compose1.3 编排启动镜像1.4 haproxy代理后端docker容器1.5 安装socat 直接操作socket控制haproxy1.6 compose中yml 配置指令参考1.6.1 简单命令1.6.2 build1.6.3 depends_on1.6.4 deploy1.6.5 logging1.6.6 ne…

【C++进阶】01:概述

概述 OVERVIEW概述C11新特性&#xff1a;C14新特性&#xff1a;C17新特性&#xff1a;C20新特性&#xff1a;C程序编译过程C内存模型CSTL1.Queue&Stack2.String3.MapC语言C语言面向过程编程✅✅面向对象编程&#xff08;类和对象&#xff09;❌✅泛型编程、元编程&#xff…

基于PaddlePaddle的图片分类实战 | 深度学习基础任务教程系列

图像相比文字能够提供更加生动、容易理解及更具艺术感的信息&#xff0c;图像分类是根据图像的语义信息将不同类别图像区分开来&#xff0c;是图像检测、图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。图像分类在安防、交通、互联网、医学等领域有着广泛的应用。 一般…

LeetCode:77. 组合——回溯法,是暴力法?

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;77. 组合 题目描述&#xff1a;给定两个整数 n 和 k&#xff0c;返回范…

风场数据抓取程序实现(java+python实现)

一、数据源参数定义 关键参数代码&#xff1a; package com.grab.catchWindData.pram;/*** ClassName: DevPrams* Description: TODO**/ public class DevPrams {public static String lev_0to0p1_m_below_ground "lev_0-0.1_m_below_ground";public static Stri…

【微服务笔记08】微服务组件之Hystrix实现请求合并功能

这篇文章&#xff0c;主要介绍微服务组件之Hystrix实现请求合并功能。 目录 一、Hystrix请求合并 1.1、什么是请求合并 1.2、请求合并的实现 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;编写服务提供者 &#xff08;3&#xff09;消费者&#xff08;Se…

React | 认识React开发

✨ 个人主页&#xff1a;CoderHing &#x1f5a5;️ Node.js专栏&#xff1a;Node.js 初级知识 &#x1f64b;‍♂️ 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; &#x1f4ab; 系列专栏&#xff1a;吊打面试官系列 16天学会Vue 11天学会React Node专栏 &#x…

【分享】免梯子的GPT,玩 ChatGPT 的正确姿势

火了一周的 ChatGPT&#xff0c;HG 不允许还有小伙伴不知道这个东西是什么&#xff1f;简单来说就是&#xff0c;你可以让它扮演任何事物&#xff0c;据说已经有人用它开始了颜色文学创作。因为它太火了&#xff0c;所以&#xff0c;本周特推在几十个带有“chatgpt”的项目中选…

双交叉注意学习用于细粒度视觉分类和目标重新识别

目录Dual Cross-Attention Learning for Fine-Grained Visual Categorization and Object Re-Identification摘要本文方法消融实验Dual Cross-Attention Learning for Fine-Grained Visual Categorization and Object Re-Identification 摘要 目的&#xff1a; 探索了如何扩展…

JDK8——新增时间类、有关时间数据的交互问题

目录 一、实体类 二、数据库 三、数据交换 四、关于LocalDateTime类型 (java 8) 4.1 旧版本日期时间问题 4.2 新版日期时间API介绍 4.2.1 LocalDate、LocalTime、LocalDateTime 4.2.2 日期时间的修改与比较 4.2.3 格式化和解析操作 4.2.4 Instant: 时间戳 4.2.5 Duration 与…

Doris(6):数据导入(Load)之Stream Load

Broker load是一个同步的导入方式&#xff0c;用户通过发送HTTP协议将本地文件或者数据流导入到Doris中&#xff0c;Stream Load同步执行导入并返回结果&#xff0c;用户可以通过返回判断导入是否成功。 1 适用场景 Stream load 主要适用于导入本地文件&#xff0c;或通过程序…

小厂实习要不要去?

大家好&#xff0c;我是帅地。 最近暑假实习招聘&#xff0c;不少 训练营 学员都拿到了小厂实习来保底&#xff0c;但是很多小厂基本要求一周内给答复&#xff0c;中大厂就还在流程之中&#xff0c;所以很纠结小厂实习要不要去。 不知道你是否有这样的纠结&#xff0c;今天帅地…

【测试面试汇总2】

目录Linux操作系统1.Linux操作命令2.在Linux中find和grep的区别&#xff1f;3.绝对路径用什么符号表示&#xff1f;4.当前目录、上层目录用什么表示&#xff1f;5.主目录用什么表示&#xff1f;6.怎么查看进程信息&#xff1f;7.保存文件并退出vi 编辑?8.怎么查看当前用户id&a…

【Python从入门到进阶】15、函数的定义和使用

接上篇《14、字典高级应用》 上一篇我们学习了有关字典的高级应用操作&#xff08;字典的增删改查&#xff09;&#xff0c;本篇我们来学习Python中函数的定义和使用&#xff0c;包括函数的参数、返回值、局部变量和全景变量等操作。 一、一个思考 例如这里有一段大东北洗浴中…

2023年PMP报考时间安排攻略!

1.2023年PMP考试时间 PMP一年开考4次&#xff0c;分别为3月、6月、9月、12月&#xff0c;预计2023年PMP第一次考试时间在2023年3月左右&#xff0c;具体以基金会官方通知为准。 1&#xff09;为什么考PMP&#xff1f; 大部分人考 PMP 无非以下几个原因&#xff0c;总的来说&…

运行时内存数据区之程序计数器

内存是非常重要的系统资源&#xff0c;是硬盘和CPU的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时选行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略&#xff0c;保证了JVM的高效稳定运行。 不同的VM对于内存的划分方式和管理机制存在着部分差…

算法时间复杂度计算

目录 1.时间复杂度计算 1.1 时间复杂度例题 1.1.1例题 1.1.2例题 1.1.3例题 1.1.4例题 1.2时间复杂度leetcode例题 1.时间复杂度计算 首先&#xff0c;我们需要了解时间复杂度是什么&#xff1a;算法的时间复杂度是指算法在编写成可执行程序后&#xff0c;运行时需要耗费…

一天吃透操作系统八股文

操作系统的四个特性&#xff1f; 并发&#xff1a;同一段时间内多个程序执行&#xff08;与并行区分&#xff0c;并行指的是同一时刻有多个事件&#xff0c;多处理器系统可以使程序并行执行&#xff09; 共享&#xff1a;系统中的资源可以被内存中多个并发执行的进线程共同使…

MATLAB | 给热图整点花哨操作(三角,树状图,分组图)

前段时间写的特殊热图绘制函数迎来大更新&#xff0c;基础使用教程可以看看这一篇&#xff1a; https://slandarer.blog.csdn.net/article/details/129292679 原本的绘图代码几乎完全不变&#xff0c;主要是增添了很多新的功能&#xff01;&#xff01;&#xff01; 工具函数完…

FastChat开放,媲美ChatGPT的90%能力——从下载到安装、部署

FastChat开放&#xff0c;媲美ChatGPT的90%能力——从下载到安装、部署前言两个前置软件创建FastChat虚拟环境安装PyTorch安装 FastChat下载 LLaMA&#xff0c;并转换生成FastChat对应的模型Vicuna启动FastChat的命令行交互将模型部署为一个服务&#xff0c;提供Web GUI前言 最…