当前位置: 首页 > news >正文

C++进程间通信 消息队列

C++进程间通信 消息队列

    • 消息队列概述
    • 消息队列代码示例
      • 1. 创建和发送消息的程序(sender.cpp)
      • 2. 接收消息的程序(receiver.cpp)
    • 代码解释
    • 运行步骤
    • 运行结果

消息队列概述

消息队列是一种进程间通信机制,允许一个或多个进程通过消息的形式进行通信。消息队列可以在内核中维护,提供了一个先进先出的队列,支持消息的优先级排序。

消息队列代码示例

1. 创建和发送消息的程序(sender.cpp)

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <iostream>
#include <cstring>
#include <cstdlib>#define MSGQ_KEY 1234
#define MSG_SIZE 128struct message 
{long msg_type;char msg_text[MSG_SIZE];
};int main() 
{int msgid = msgget(MSGQ_KEY, 0666 | IPC_CREAT);  // 创建消息队列if (msgid == -1) {perror("msgget");exit(EXIT_FAILURE);}message msg;msg.msg_type = 1;  // 消息类型strcpy(msg.msg_text, "Hello from sender process!");  // 消息内容if (msgsnd(msgid, &msg, sizeof(msg.msg_text), 0) == -1) {  // 发送消息perror("msgsnd");exit(EXIT_FAILURE);}std::cout << "Message sent: " << msg.msg_text << std::endl;return 0;
}

2. 接收消息的程序(receiver.cpp)

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <iostream>
#include <cstring>
#include <cstdlib>#define MSGQ_KEY 1234
#define MSG_SIZE 128struct message 
{long msg_type;char msg_text[MSG_SIZE];
};int main() 
{int msgid = msgget(MSGQ_KEY, 0666 | IPC_CREAT);  // 获取消息队列if (msgid == -1) {perror("msgget");exit(EXIT_FAILURE);}message msg;if (msgrcv(msgid, &msg, sizeof(msg.msg_text), 1, 0) == -1) {  // 接收消息perror("msgrcv");exit(EXIT_FAILURE);}std::cout << "Message received: " << msg.msg_text << std::endl;if (msgctl(msgid, IPC_RMID, nullptr) == -1) {  // 删除消息队列perror("msgctl");exit(EXIT_FAILURE);}return 0;
}

代码解释

  1. 创建和发送消息的程序(sender.cpp)

    • msgget(MSGQ_KEY, 0666 | IPC_CREAT): 创建一个消息队列,如果消息队列不存在则创建,否则获取现有的消息队列。
    • 定义一个message结构,包含消息类型和消息文本。
    • 设定消息类型并赋值消息文本。
    • msgsnd(msgid, &msg, sizeof(msg.msg_text), 0): 发送消息到消息队列。
    • 打印发送的消息。
  2. 接收消息的程序(receiver.cpp)

    • msgget(MSGQ_KEY, 0666 | IPC_CREAT): 获取消息队列。
    • 定义一个message结构,包含消息类型和消息文本。
    • msgrcv(msgid, &msg, sizeof(msg.msg_text), 1, 0): 从消息队列接收类型为1的消息。
    • 打印接收到的消息。
    • msgctl(msgid, IPC_RMID, nullptr): 删除消息队列。

运行步骤

  1. 分别编译sender.cppreceiver.cpp
    g++ sender.cpp -o sender
    g++ receiver.cpp -o receiver
    
  2. 打开两个终端,在第一个终端运行接收程序:
    ./receiver
    
  3. 在第二个终端运行发送程序:
    ./sender
    

运行结果

第一个终端(运行接收程序)输出:

Message received: Hello from sender process!

第二个终端(运行发送程序)输出:

Message sent: Hello from sender process!

相关文章:

  • STEP 7-MicroWIN SMART
  • TalkingData数据统计的力量
  • 短信平台-平台群发短信
  • 用户接入和认证技术
  • Sql语法3
  • 【芯片验证方法】
  • 大数据技术分享 | Kylin入门系列:基础介绍篇
  • MindSpore实践图神经网络之环境篇
  • Nacos 2.x 系列【12】配置加密插件
  • 【二叉树】:LeetCode:100.相同的数(分治)
  • Spring-注解
  • vue 打印、自定义打印、页面打印、隐藏页眉页脚
  • kotlin基础之协程
  • 【5.基础知识和程序编译及调试】
  • 第十三章 进程与线程
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • angular2开源库收集
  • Babel配置的不完全指南
  • create-react-app做的留言板
  • ECMAScript6(0):ES6简明参考手册
  • ES6语法详解(一)
  • JavaScript的使用你知道几种?(上)
  • node学习系列之简单文件上传
  • Python3爬取英雄联盟英雄皮肤大图
  • Spark RDD学习: aggregate函数
  • tweak 支持第三方库
  • 阿里研究院入选中国企业智库系统影响力榜
  • 翻译--Thinking in React
  • 使用Swoole加速Laravel(正式环境中)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 找一份好的前端工作,起点很重要
  • mysql面试题分组并合并列
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #if 1...#endif
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (译) 函数式 JS #1:简介
  • .htaccess配置常用技巧
  • .net FrameWork简介,数组,枚举
  • .NET Standard 的管理策略
  • .NET 服务 ServiceController
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET委托:一个关于C#的睡前故事
  • .Net下的签名与混淆
  • .py文件应该怎样打开?
  • @Resource和@Autowired的区别
  • [ solr入门 ] - 利用solrJ进行检索