Linux C++实现进程间通信——消息队列(结合protobuf)
创始人
2025-05-31 14:46:32

基本知识

基本知识介绍参考:https://mp.weixin.qq.com/s/oSXUJiLT_qJoW4xk-zAf6g

进程间通信简称IPC(Inter process communication),进程间通信就是在不同进程之间传播或交换信息,通常采用的方法有共享内存、信号量、管道和消息队列等。

消息队列本质是一个存储消息的链表,这些消息具有特定的格式及特定优先级。消息队列是随内核持续的,只有在内核重启或删除一个消息队列时,该消息队列才会真正地被删除。

API函数

1.获取键值。

 key_t ftok ( char *pathname, char proj_id );
  • 每个消息队列都要在系统范围内有对应的唯一键值。
  • 其中参数fname是指定的文件名,这个文件必须是存在的而且可以访问的。
  • id是子序号,它是一个8bit的整数。即范围是0~255。当函数执行成功,则会返回key_t键值,否则返回-1。
  • 在一般的UNIX中,通常是将文件的索引节点取出,然后在前面加上子序号就得到key_t的值。

2. 创建或打开消息队列

int msgget(key_t key ,int msgflg ); 
  • 与其他的IPC机制一样,程序必须提供一个键来命名某个特定的消息队列。
  • msgflg是一个权限标志,表示消息队列的访问权限,它与文件的访问权限一样。IPC_EXCL和IPC_CREAT一起使用,如果对应键值的消息队列已经存在,则出错返回-1。IPC_CREAT|0666 表示如果不存在则创建,并且给权限。

3. 发送消息

int msgsnd(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);
  • msg_ptr是一个指向准备发送消息的指针,但是消息的数据结构却有一定的要求,消息结构要定义如下格式:

  • msg_ptr是一个指向准备发送消息的指针,但是消息的数据结构却有一定的要求,消息结构要定义如下格式:
    在这里插入图片描述

  • msg_sz为要发送消息的大小,不含消息类型占用字节。

  • msgflg为0表示当消息队列满时,msgsnd将会阻塞,直到消息能写进消息队列。

  • msg_sz为要发送消息的大小,不含消息类型占用字节。

  • msgflg为0表示当消息队列满时,msgsnd将会阻塞,直到消息能写进消息队列。
    4. 接收消息

int msgrcv(int msgid, void *msg_ptr, size_t msg_st, long int msgtype, int msgflg);
  • msgflg为0表示阻塞式接收消息,没有该类型的消息msgrcv函数一直阻塞等待。
    5. 控制消息队列
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
  • 控制消息队列,成功返回0,失败返回-1

代码示例

代码放这了,可以直接下载测试

git clone https://github.com/zlshao/MQ_demo.git
sudo chmod 777 run.sh
./run.sh

会产生两个可执行文件,开两个终端分别运行就可以了。

下面简单讲解一下代码

  1. 创建一个msg.proto,里面存放要通过消息队列传输的数据正文,我放了一个id和一个文本消息text。关于protobuf的具体讲解可以参考以下链接:
    链接1-protobuf
    链接2-protobuf
syntax = "proto2";
package messageQ;message Msgbuf{optional int64 id=1;optional string text=2;}
  1. send.cpp
#include
#include
#include
#include
#include
#include
using namespace std;#include"msg.pb.h"struct Msgstruct{long type; //类型是固定的,必须要有的char data[256]; //这里存放序列化后的proto消息!!!
};int main(){messageQ::Msgbuf sendData;//设置需要发送的消息,包括ID和textsendData.set_id(111); sendData.set_text("This is a protobuf message");//序列化为string发送。其实也可以直接序列化为数组string str=sendData.SerializePartialAsString();Msgstruct writeMsg;writeMsg.type=888; //888为消息类型strcpy(writeMsg.data,str.c_str());int msgID=msgget(0x1234,IPC_CREAT|0777);if(msgID==-1){cout<<"Failure!"<
  1. receive.cpp
#include 
#include 
#include 
#include 
#include 
#include#include"msg.pb.h"using namespace std;struct Msgstruct{long type;char data[256];
};int main(){Msgstruct readMsg;int msgID=msgget(0x1234,IPC_CREAT|0777);if(msgID==-1){cout<<"failure!"<
  1. 运行效果:
    在这里插入图片描述
    在这里插入图片描述

相关内容

热门资讯

头歌--第1关:Linux文件... 任务描述 假设系统中存在一个文件File,修改该文件的权限,根据实际需求...
【Spring从成神到升仙系列... 👏作者简介:大家好,我是爱敲代码的小黄,独...
梦见蜈蚣是什么意思,做梦梦见蜈... 梦见蜈蚣是什么意思目录梦见蜈蚣是什么意思做梦梦见蜈蚣什么意思梦见蜈蚣是什么意思,哪里有解释啊梦见蜈蚣...
小区车位比一般是多少,车库配比... 小区车位比一般是多少目录小区车位比一般是多少车库配比是什么小区总户数8200,总车位是1450个,配...
车锁上的lock什么意思,汽车... 车锁上的lock什么意思目录车锁上的lock什么意思汽车上lock是什么意思?车子上“lock标志”...
kirin710是什么处理器,... kirin710是什么处理器目录kirin710是什么处理器海思kirin710是高通多少?骁龙71...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
跟着文档制作cocos第一个游... 背景 近期打算学习一下cocos creator,想着开发自己的游戏,是...
乌干达是什么梗,网络语乌干达什... 乌干达是什么梗目录乌干达是什么梗网络语乌干达什么意思?乌干达是什么梗乌干达是什么梗乌干达是什么梗 ...
车载电子狗怎么用,怎样使用电子... 车载电子狗怎么用目录车载电子狗怎么用怎样使用电子狗怎么使用电子狗求简答车载电子狗怎么使用车载电子狗怎...
梦见偷东西是什么意思,梦见自己... 梦见偷东西是什么意思目录梦见偷东西是什么意思梦见自己偷东西是什么意思?做梦梦见自己偷东西好不好梦见偷...
黄金瞳到底是什么,黄金瞳电视剧... 黄金瞳到底是什么目录黄金瞳到底是什么黄金瞳电视剧什么时候上映?《黄金瞳》的结局是什么?电视剧《黄金瞳...
前端-session、jwt 目录:   (1)session (2&#x...
企业即时通讯怎样为企业实现移动... 对于企业来说,在办公过程中少不了工作人员相互传递信息和数据传输,企业内部...
骑行选择什么自行车 极速百科网... 骑行选择什么自行车目录骑行选择什么自行车骑行选择什么自行车 1. 山地自行车:适合崎岖不平的路...
蓝色都有哪几种,蓝色都有什么颜... 蓝色都有哪几种目录蓝色都有哪几种蓝色都有什么颜色的蓝图片,蓝色都有什么颜色的蓝二年级蓝色有哪些种类蓝...
如何自学游泳要安全的,初学游泳... 如何自学游泳要安全的目录如何自学游泳要安全的初学游泳的人需要准备哪些东西,注意哪些事项?如何自学游泳...
一年级家长的话怎么写评语,一年... 一年级家长的话怎么写评语目录一年级家长的话怎么写评语一年级学生评价手册家长寄语怎么写一年级最佳家长评...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
docker 镜像管理 查看本地镜像 docker images 可以查看本地下载的镜像 docker images [O...
k8s-1.22.15部署ng... 1.介绍 在前面文章中已经提到,Service对集群之外暴露服务的主要方式有两种&#x...
革命烈士寄语怎么写,清明节缅怀... 革命烈士寄语怎么写目录革命烈士寄语怎么写清明节缅怀先烈的寄语有哪些呢?革命烈士寄语怎么写 革命...
5万元以下新车推荐,5万以下买... 本篇文章极速百科给大家谈谈5万元以下新车推荐,5万以下买什么车好,以及5万以下的新车哪款最好对应的知...
真皮沙发翻新一般多少钱?(真皮... 本篇文章极速百科给大家谈谈真皮沙发翻新一般多少钱?,以及真皮沙发翻新一般多少钱一个对应的知识点,希望...
磨皮什么意思(磨皮是啥?) 磨... 本篇文章极速百科给大家谈谈磨皮什么意思,以及磨皮是啥?对应的知识点,希望对各位有所帮助,不要忘了收藏...
进程间通信【Linux】 1. 进程间通信 1.1 什么是进程间通信 在 Linux 系统中,进程间通信...
从NVIDIA GTC大会,看... 从NVIDIA GTC 2023这场全球行业盛宴,我们可以解读出AI算力行业的哪些重要...
请问什么是童子,什么是童子 极... 请问什么是童子目录请问什么是童子什么是童子古代 童子是什么意思童子是什么意思?请问什么是童子 ...
中招考试考哪些科目,中招考试考... 中招考试考哪些科目目录中招考试考哪些科目中招考试考几门科目一共多少分?中考有哪些科目中考考几科,都什...
做电商如何做,电商怎样做才能赚... 做电商如何做目录做电商如何做电商怎样做才能赚钱?做的好的电商朋友可以教教我怎么做吗新手小白怎么做跨境...