P14 Linux进程间通信——消息队列.........

目录

前言    

01 消息队列

02 如何创建队列 

小结


前言    

                  

🎬 个人主页:@ChenPi

🐻推荐专栏1: 《Linux C应用编程(概念类)_@ChenPi的博客-CSDN博客》✨✨✨ 

🔥 推荐专栏2: 《C++_@ChenPi的博客-CSDN博客》✨✨✨

🛸推荐专栏3: ​​​​​​《链表_@ChenPi的博客-CSDN博客 》 ✨✨✨
🌺本篇简介  : 这一章我们学习Linux进程间通信中的消息队列

在 Linux系统中,以进程为单位分配和管理资源。

由于保护的缘故,一个进程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭。

但在一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项任务,因此要求进程之间必须能够互相通信,从而来共享资源和信息。

所以,一个操作系统内核必须提供进程间的通信机制(IPC)。

目前,Linux使用的进程间的通信方式主要有

管道(pipe)和有名管道(FIFO)

信号(signal)

消息队列

共享内存

信号量

套接字(socket)

 本节中,将消息队列和使用 进行讲解

01 消息队列

消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。

 

我的理解是这样的,如果有什么不对,欢迎大佬指正 

特点

  1. 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
  2. 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
  3. 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

函数原型

#include <sys/msg.h>// 创建或打开消息队列:成功返回队列ID,失败返回-1
int msgget(key_t key, int flag);// 队列中添加消息:成功返回0,失败返回-1
int msgsnd(int msqid, const void *ptr, size_t size, int flag);// 在队列中读取消息:成功返回消息数据的长度,失败返回-1
int msgrcv(int msqid, void *ptr, size_t size, long type,int flag);// 控制消息队列:成功返回0,失败返回-1
int msgctl(int msqid, int cmd, struct msqid_ds *buf);

02 如何创建队列 

在以下两种情况下,msgget将创建一个新的消息队列:

  1. 如果没有与键值key相对应的消息队列,并且flag中包含了IPC_CREAT标志位。
  2. key参数为IPC_PRIVATE。
    int msgfd = msgget(1111,IPC_CREAT|0600);if(-1 ==  msgfd)    {puts("msgget failed");}

这个key的参数我看源码是一个整形数,我就想试一下给他一个整形数行不行 

函数msgrcv在读取消息队列时,type参数有下面几种情况:

  1. type == 0,返回队列中的第一个消息;
  2. type > 0,返回队列中消息类型为 type 的第一个消息;
  3. type < 0,返回队列中消息类型值小于或等于 type 绝对值的消息,如果有多个,则取类型值最小的消息。

可以看出,type值非 0 时用于以非先进先出次序读消息。也可以把 type 看做优先级的权值。

例子
下面写了一个简单的使用消息队列进行IPC的例子,服务端程序一直在等待特定类型的消息,当收到该类型的消息以后,发送另一种特定类型的消息作为反馈,客户端读取该反馈并打印出来。

msg_get.c 获取来自send.c发来的数据

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>struct Msgbuf
{long mtype;char buf[128];
};int main()
{struct Msgbuf msg;int msgfd = msgget(1111,IPC_CREAT|0600);if(-1 ==  msgfd)    {puts("msgget failed");}msgrcv(msgfd, &msg, sizeof(msg.buf),888, 0);printf("read msg from client %s\n",msg.buf);return  0;
}


msg_send.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>struct Msgbuf
{long mtype;char buf[128];
};int main()
{struct Msgbuf msg = {888,"I am client"};int msgfd = msgget(1111,IPC_CREAT|0600);if(-1 ==  msgfd)    {puts("msgget failed");}msgsnd(msgfd, &msg, strlen(msg.buf),0);printf("read msg from client %s\n",msg.buf);return  0;
}

这里需要注意的就是,除了要注意创建或打开消息队列的key值要一致时,还有就是,发送接收消息的类型也要对应才能找到对应数据,就是示例代码中的888

小结

  1. 采用消息队列通信比采用管道通信具有更多的灵活性,通信的进程不但没有血缘上的要求,也不需要进行同步处理。
  2. 消息队列是一种先进先出的队列型数据结构;
  3. 消息队列将输出的信息进行了打包处理,可以保证以消息为单位进行接收;
  4. 消息队列对信息进行分类服务,根据消息的类别进行分别处理。
  5. 提供消息数据自动拆分功能,同时不能接受两次发送的消息。
  6. 消息队列提供了不完全随机读取的服务。
  7. 消息队列提供了完全异步的读写服务。

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

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

相关文章

spider小案例~https://industry.cfi.cn/BCA0A4127A4128A4141.html

一、获取列表页信息 通过抓包发现列表页信息非正常返回&#xff0c;列表信息如下图&#xff1a; 通过观察发现列表页信息是通过unes函数进行处理的&#xff0c;我们接下来去看下该函数 该函数是对列表页的信息先全局替换"~"为"%u"&#xff0c;然后再通过…

Linux基础指令(2)

今天我们继续来学我们有关于Linux的指令&#xff0c;今天的指令要比上次多多了。开始我们的学习吧。 man手册 先来看标题&#xff0c;手册我们第一时间想到的就是手册的查阅功能&#xff0c;我们都知道在我们上小学的时候&#xff0c;如果遇到不会的字&#xff0c;我们会通过…

2023年度盘点:智能汽车、自动驾驶、车联网必读书单

【文末送书】今天推荐几本自动驾驶领域优质书籍 前言 2023年&#xff0c;智能驾驶和新能源汽车行业仍然有着肉眼可见的新进展。自动驾驶技术继续尝试从辅助驾驶向自动驾驶的过渡&#xff0c;更重要的是相关技术成本的下降。根据《全球电动汽车展望2023》等行业报告&#xff0c…

目标检测——R-FCN算法解读

论文&#xff1a;R-FCN: Object Detection via Region-based Fully Convolutional Networks 作者&#xff1a;Jifeng Dai, Yi Li, Kaiming He and Jian Sun 链接&#xff1a;https://arxiv.org/pdf/1605.06409v2.pdf 代码&#xff1a;https://github.com/daijifeng001/r-fcn 文…

vue每个页面的缓存数据

一个缓存页面的数组 一个用于每个页面的高度缓存 cacheList 缓存页面的 tableScroll 缓存高度 在组件中使用该方法

MySQL8.0.35 安装配置教程(保姆级,包含图文讲解,环境变量的配置)适合小白

文章目录 MySQL安装教程一.下载MySQL二、安装MySQL三、配置环境变量 MySQL安装教程 一.下载MySQL MySQL下载页面链接&#xff1a;https://dev.mysql.com/downloads/installer/ 选择你要下载的版本号。 本文章是8.0.35版本  这里我们无需注册&#xff0c;只需要点下载就好…

树根研习社|数据为王,洞察“工业数据采集”背后的价值与实践

一、工业数据采集是什么&#xff1f; 数据采集是将各种信息传感设备通过网络结合起来&#xff0c;实现任何时间、任何地点&#xff0c;人、机、物的互联互通。数据采集的主要的作用是&#xff1a; “翻译官”&#xff1a;不同程序语言的设备数据通过协议解析“翻译”为上层系…

深入Redis过程-持久化

目录 redis实现持久化 RDB 触发机制-定期方法 定期-手动触发 save bgsave 定期-自动触发 AOF 开启AOF功能 刷新缓冲区策略 重写机制 混合持久化 Redis事务 事务相关的命令 MULTI EXEC DISCARD WATCH redis实现持久化 RDB RDB叫做Redis数据备份文件&#xf…

函数的栈帧

我们每次在调用函数的时候&#xff0c;都说会进行传参。每次创建函数&#xff0c;或者进行递归的时候&#xff0c;也会说会进行压栈。 那么&#xff0c;今天我们就来具体看看函数到底是如何进行压栈&#xff0c;传参的操作。 什么是栈&#xff1f; 首先我们要知道&#xff0c;…

SpringBoot中MyBatis-Flex的集成和使用

一、MyBatis-Flex 是什么​ MyBatis-Flex是一个基于MyBatis的数据访问框架&#xff0c;专门为Flex应用程序而设计的。它提供了一种灵活而高效的方式来处理Flex应用程序中的数据访问&#xff0c;可以轻松地连接到各种数据源&#xff0c;并提供了一些方便的工具和功能&#xff0c…

联邦蒸馏中的分布式知识一致性 | TIST 2024

联邦蒸馏中的分布式知识一致性 | TIST 2024 联邦学习是一种隐私保护的分布式机器学习范式&#xff0c;服务器可以在不汇集客户端私有数据的前提下联合训练机器学习模型。通信约束和系统异构是联邦学习面临的两大严峻挑战。为同时解决上述两个问题&#xff0c;联邦蒸馏技术被提…

Global IIIumination(GI)全局光照原理(一)3D空间全局光照

文章目录 一、Global IIIumination&#xff08;GI&#xff09;全局光照基本概念二、主流的全局光照方法&#xff1a;三、Reflective shadow maps&#xff08;RSM&#xff09;反射阴影贴图 全局光照四、Light Propagation Volumes (LPV)光线传播体积 全局光照1.第一步&#xff0…