当前位置: 首页 > 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!
http://www.lryc.cn/news/357472.html

相关文章:

  • mysql中InnoDB的统计数据
  • P459 包装类Wrapper
  • Kong网关的负载均衡
  • 这是一个逗号
  • oracle tree
  • react-beautiful-dnd 横纵排序demo
  • web练习
  • 模型蒸馏笔记
  • HAL库使用FreeRTOS实时操作系统时配置时基源(TimeBase Source)
  • 如何让你的网站能通过域名访问
  • Spring Boot + Spring Security + JWT 从零开始
  • 【busybox记录】【shell指令】rmdir
  • [LitCTF 2023]yafu (中级) (素数分解)
  • MySQL alter 语句
  • 列表推导式(解析式)python
  • YOLO-10更快、更强
  • 新火种AI|寻求合作伙伴,展开豪赌,推出神秘AI项目...苹果能否突破AI困境?
  • MFC工控项目实例一主菜单制作
  • 代码随想录-Day22
  • uniapp项目 使用vue-plugin-hiprint静默打印功能
  • 视频汇聚EasyCVR视频监控平台GA/T 1400协议特点及应用领域解析
  • 基于似然场的快速避障算法
  • Flutter 中的 IndexedStack 小部件:全面指南
  • 基于51单片机的交通灯设计
  • ECMAScript 详解
  • 使用Java Swing制作一个飞翔的小鸟游戏
  • leetcode 684.冗余连接
  • RestTemplet 自定义消息转换器总结
  • 贝叶斯算法:机器学习中的“黄金法则”与性能提升之道
  • element-ui 实现输入框下拉树组件(2024-05-23)