进程间通信-消息队列

消息队列的公共资源是链表结构。
通信双方不会和消息队列进行挂接,而是像管道一样,访问内存中的消息队列。
在这里插入图片描述

消息队列由操作系统维护,但是由通信的某一方创建和删除
通信双方都需要获取到消息队列,和共享内存一样。

当发送方有数据发送时,将数据先打包成一个节点,然后尾插到内核中的消息队列中去。
当接收方接收数据时,从队列头部开始去找所需要的节点,然后进行解包得到数据。

    消息队列和普通队列不一样,不是严格按照先进先出的规则。读取方可以跳过队头寻找自己需要的数据。但是相同的数据,必须先读取靠近队头的。

如上图中,当读取方需要的是香蕉,但是队头是苹果,此时就可以跳过苹果,读取香蕉,并且靠近队头的香蕉先被读取。
2.消息队列相关函数
msgget()
int msgget(key_t ,int msflg)

    key:和共享内存一样,也需要生成,是消息队列唯一性的标识符。msgflg:和共享内存一样,可以是IPC_CREAT或者IPC_EXCL或者是二者的组合。返回值:返回消息队列的标识符,供用户层使用。

msgctl()
int msgctl(int msgid,int cmd,struct msqid_dsbuf)
参数和共享内存的shmctl一样。
在这里插入图片描述
**第一个成员变量的类型是
struct ipc_perm*,变量名是msg_perm,结构类型和共享内存的一样。**
msgsnd()
int msgsnd(int msgid,const void*msgp,size_t msgsz,int msgflg)
msgid:消息队列标识符
msgp:要发送数据所在的数组,元素类型是 struct msgbuf
msgsz:要发生的数据大小,以字节为单位
msgflg:创建标记,如果使用IPC_NOWAIT,失败就会立即返回。
0:阻塞发送
IPC_NOWAIT:非阻塞发送
返回值:失败返回-1,成功返回0
在发送数据之前,先对数据进行打包
struct msgbuf
{
long mtype; //数据类型,必须大于0
char mtext[1];//要发送的数据
};

msgrcv()
ssize_t msgrcv(int msgid,void*msgp,size_t msgsz,long msgtyp,int msgflg)
msgid:消息队列标识符
msgp:接收的数据后要存放的地址
msgsz:要接收的数据大小
msgtype:发送方设定的数据类型标识
0:读取队列中的第一条消息(不在乎当前队列头元素是什么消息类型,将他当作普通队列来处理)。
大于0(约定值):读取队列中类型为msgtyp 的第一条消息。(就是读取对列元素中第一个香蕉)
小于0:读取队列中最小类型小于或等于msgtyp 绝对值的第一条消息。
msgflg:创建标记,如果指定IPC_ NOWAIT,获取失败会立刻返回
0:阻塞接收
NOWAIT:非阻塞接收

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
// 定义消息结构体
struct msbuf {long mytype;  // 消息类型char mtext[50]; // 消息内容
};
int main() {key_t key = ftok(".", 'a'); // 获取消息队列的键值int msqid = msgget(key, IPC_CREAT | 0666); // 创建消息队列struct msbuf buf; // 声明消息结构体// 发送两条消息,类型分别为1和2strcpy(buf.mtext, "Hello from type 1 message!");buf.mytype = 1;msgsnd(msqid, &buf, sizeof(struct msbuf) - sizeof(long), 0); // 发送消息strcpy(buf.mtext, "Hello from type 2 message!");buf.mytype = 2;msgsnd(msqid, &buf, sizeof(struct msbuf) - sizeof(long), 0); // 发送消息// 接收消息,并根据类型进行处理for (int i = 0; i < 2; i++) {msgrcv(msqid, &buf, sizeof(struct msbuf) - sizeof(long), 0, 0); // 接收消息if (buf.mytype == 1) {printf("Received type 1 message: %s\n", buf.mtext);} else if (buf.mytype == 2) {printf("Received type 2 message: %s\n", buf.mtext);} else {printf("Received unknown type message: %s\n", buf.mtext);}}// 删除消息队列msgctl(msqid, IPC_RMID, NULL);return 0;
}

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

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

相关文章

【计算机网络】Web HTTP

Web和HTTP HTTP 超文本传输协议 HyperText Transfer Protocol HTTP使用TCP作为支撑传输协议 由一个客户程序和一个服务器程序实现一些常见名词。。。无状态协议 stateless protocol 不保存关于客户的任何信息非持续/持续链接 non-persistent con…

[算法学习]

矩阵乘法 只有当左矩阵列数等于右矩阵行数&#xff0c;才能相乘N*M的矩阵和M*K的矩阵做乘法后矩阵大小为N*k矩阵乘法规则&#xff1a;第一个矩阵A的第 i 行与第二个矩阵的第 j 列的各M个元素对应相乘再相加得到新矩阵C[i][j]的值 整除 同余 同余的性质 线性运算&#xff0c;…

大数据Flume--入门

文章目录 FlumeFlume 定义Flume 基础架构AgentSourceSinkChannelEvent Flume 安装部署安装地址安装部署 Flume 入门案例监控端口数据官方案例实时监控单个追加文件实时监控目录下多个新文件实时监控目录下的多个追加文件 Flume Flume 定义 Flume 是 Cloudera 提供的一个高可用…

Python远程控制工具的使用

本节我们对所编写的远程控制工具的功能进行测试。首先开启主控端程序&#xff0c; 如下所示&#xff1a; 接下来打开被控端程序。当被控端打开时&#xff0c;主控端会收到被控端的连接请 求。 开启被控端程序&#xff1a; 主控端接收到连接请求并显示被控端主机的信息&#xff…

《杨绛传:生活不易,保持优雅》读书摘录

目录 书简介 作者成就 书中内容摘录 良好的家世背景&#xff0c;书香门第为求学打基础 求学相关 念大学 清华研究生 自费英国留学 法国留学自学文学 战乱时期回国 当校长 当小学老师 创造话剧 支持钱锺书写《围城》 出任震旦女子文理学院的教授 接受清华大学的…

【小沐学GIS】基于Android绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

【新书推荐】7.4 多重循环

本节必须掌握的知识点&#xff1a; for循环嵌套语句 示例二十五 代码分析 汇编解析 7.4.1 for循环嵌套语句 在我们总结中&#xff0c;语句块这个解释不知道读者是否感到不解&#xff0c;既然语句块里可以做任何事情&#xff0c;那么它的里面就可以再写一个循环语句&#xff0…

Swift 初见

Swift 初见 学习swift的记录 控制台输出 print("hello world")可以无分号&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 变量声明 let 常量声明 如果在常量声明后再次修改他会报错 var 变量声明 一个常量的值&#xf…

专业课135+总分400+西安交通大学815/909信号与系统考研电子信息与通信工程,真题,大纲,参考书。

经过将近一年的考研复习&#xff0c;终于梦圆西安交大&#xff0c;今年专业可815(和909差不多)信号与系统135&#xff0c;总分400&#xff0c;回想这一年的复习还是有很多经验和大家分享&#xff0c;希望可以对大家复习有所帮助&#xff0c;少走弯路。 专业课&#xff1a; 这…

BootStrap学习笔记JS插件(一)--模态弹出框

一、弹出框基础 <div class"modal show"><div class"modal-dialog"><div class"modal-content"><div class"modal-header"><button type"button" class"close" data-dismiss"mo…

Hadoop:认识MapReduce

MapReduce是一个用于处理大数据集的编程模型和算法框架。其优势在于能够处理大量的数据&#xff0c;通过并行化来加速计算过程。它适用于那些可以分解为多个独立子任务的计算密集型作业&#xff0c;如文本处理、数据分析和大规模数据集的聚合等。然而&#xff0c;MapReduce也有…

我主编的电子技术实验手册(03)——电阻的识别与测量

本专栏是笔者主编教材&#xff08;图0所示&#xff09;的电子版&#xff0c;依托简易的元器件和仪表安排了30多个实验&#xff0c;主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】&#xff0c;精心设计的【实验步骤】&#xff0c;全面丰富的【思考习…