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

消息队列概述

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

消息队列代码示例

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 128

struct 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 128

struct 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!
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Warren++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值