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;
}
代碼解釋
-
創建和發送消息的程序(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!