消息队列概述
消息队列是一种进程间通信机制,允许一个或多个进程通过消息的形式进行通信。消息队列可以在内核中维护,提供了一个先进先出的队列,支持消息的优先级排序。
消息队列代码示例
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;
}
代码解释
-
创建和发送消息的程序(sender.cpp):
msgget(MSGQ_KEY, 0666 | IPC_CREAT)
: 创建一个消息队列,如果消息队列不存在则创建,否则获取现有的消息队列。- 定义一个
message
结构,包含消息类型和消息文本。 - 设定消息类型并赋值消息文本。
msgsnd(msgid, &msg, sizeof(msg.msg_text), 0)
: 发送消息到消息队列。- 打印发送的消息。
-
接收消息的程序(receiver.cpp):
msgget(MSGQ_KEY, 0666 | IPC_CREAT)
: 获取消息队列。- 定义一个
message
结构,包含消息类型和消息文本。 msgrcv(msgid, &msg, sizeof(msg.msg_text), 1, 0)
: 从消息队列接收类型为1的消息。- 打印接收到的消息。
msgctl(msgid, IPC_RMID, nullptr)
: 删除消息队列。
运行步骤
- 分别编译
sender.cpp
和receiver.cpp
:g++ sender.cpp -o sender g++ receiver.cpp -o receiver
- 打开两个终端,在第一个终端运行接收程序:
./receiver
- 在第二个终端运行发送程序:
./sender
运行结果
第一个终端(运行接收程序)输出:
Message received: Hello from sender process!
第二个终端(运行发送程序)输出:
Message sent: Hello from sender process!