Linux系统消息队列
Linux系统消息队列
实现代码
- Receiver.cpp
#include <bits/stdc++.h>
#include <unistd.h>
#include <sys/msg.h>
using namespace std;const int BUFFER_SIZE = 1024;
const int KEY = 6666;struct Message {int messageType;char buffer[BUFFER_SIZE];
};int main(int argc, char const *argv[])
{int messageID;Message message;int messageReceive = 0;if ((messageID = msgget((key_t)KEY, 0666 | IPC_CREAT)) == -1) {fprintf(stderr, "Message get failed!\n");abort();}while (true) {if (msgrcv(messageID, (void*)&message, BUFFER_SIZE, messageReceive, 0) == - 1) {fprintf(stderr, "Message receive failed!\n");abort();}printf("Receive data: %s", message.buffer);if (!strncmp(message.buffer, "finish", 6)) {break;}}if (msgctl(messageID, IPC_RMID, 0) == -1) {fprintf(stderr, "Message delete failed!\n");abort();}return 0;
}
- Sender.cpp
#include <bits/stdc++.h>
#include <unistd.h>
#include <sys/msg.h>
using namespace std;const int BUFFER_SIZE = 1024;
const int KEY = 6666;struct Message {int messageType;char buffer[BUFFER_SIZE];
};int main(int argc, char const *argv[])
{Message message;int messageID;if ((messageID = msgget((key_t)KEY, 0666 | IPC_CREAT)) == -1) {fprintf(stderr, "Message get failed!\n");abort();}while (true) {char buffer[BUFFER_SIZE];printf("Send data:");fgets(buffer, BUFFER_SIZE, stdin);message.messageType = 1;strcpy(message.buffer, buffer);if (msgsnd(messageID, (void*)&message, BUFFER_SIZE, 0) == -1) {fprintf(stderr, "Message send failed!\n");abort();}usleep(100);if (!strncmp(message.buffer, "finish", 6)) {break;}}return 0;
}
相关函数
msgget()
- 函数原型
int msgget(key_t key, int msgflg);
- 参数
- key为消息队列关联键
- msgflg为消息队列的建立标志和存取权限
- 返回值
成功返回消息队列标识值,否则返回-1
- 功能
用于创建一个新的或打开一个已经存在的消息队列
msgrcv()
- 函数原型
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
- 参数
- msqid为消息队列的识别码
- msgp是指向消息缓冲区的指针
- msgtyp为消息类型
msgtyp等于0 则返回队列的最早的一个消息。
msgtyp大于0,则返回其类型为msgtyp的第一个消息。
msgtyp小于0,则返回其类型小于或等于mtype参数的绝对值的最小的一个消息。- msgflg:这个参数依然是控制函数行为的标志,取值可以是:0,表示忽略
- 返回值
成功返回拷贝到mtext数组的实际字节数,否则返回-1
- 功能
从消息队列中读取消息
msgsnd()
- 函数原型
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
- 参数
- msqid为消息队列的识别码
- msgp是指向消息缓冲区的指针
- msgtyp为消息类型
msgtyp等于0 则返回队列的最早的一个消息。
msgtyp大于0,则返回其类型为msgtyp的第一个消息。
msgtyp小于0,则返回其类型小于或等于mtype参数的绝对值的最小的一个消息。- msgflg:这个参数依然是控制函数行为的标志,取值可以是:0,表示忽略
- 返回值
成功返回0,否则返回-1
- 功能
将一个新的消息写入队列
编译
- 注意编译的文件名与实现代码文件名保持一致
g++ Receiver.cpp -o Receiver
g++ Sender.cpp -o Sender
./Receiver & ./Sender
测试结果
Send data:This
Receive data: This
Send data:is
Receive data: is
Send data:sender
Receive data: sender
Send data:finish
Receive data: finish
鸣谢
百度百科
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
Linux系统消息队列
Linux系统消息队列
实现代码
- Receiver.cpp
#include <bits/stdc++.h>
#include <unistd.h>
#include <sys/msg.h>
using namespace std;const int BUFFER_SIZE = 1024;
const int KEY = 6666;struct Message {int messageType;char buffer[BUFFER_SIZE];
};int main(int argc, char const *argv[])
{int messageID;Message message;int messageReceive = 0;if ((messageID = msgget((key_t)KEY, 0666 | IPC_CREAT)) == -1) {fprintf(stderr, "Message get failed!\n");abort();}while (true) {if (msgrcv(messageID, (void*)&message, BUFFER_SIZE, messageReceive, 0) == - 1) {fprintf(stderr, "Message receive failed!\n");abort();}printf("Receive data: %s", message.buffer);if (!strncmp(message.buffer, "finish", 6)) {break;}}if (msgctl(messageID, IPC_RMID, 0) == -1) {fprintf(stderr, "Message delete failed!\n");abort();}return 0;
}
- Sender.cpp
#include <bits/stdc++.h>
#include <unistd.h>
#include <sys/msg.h>
using namespace std;const int BUFFER_SIZE = 1024;
const int KEY = 6666;struct Message {int messageType;char buffer[BUFFER_SIZE];
};int main(int argc, char const *argv[])
{Message message;int messageID;if ((messageID = msgget((key_t)KEY, 0666 | IPC_CREAT)) == -1) {fprintf(stderr, "Message get failed!\n");abort();}while (true) {char buffer[BUFFER_SIZE];printf("Send data:");fgets(buffer, BUFFER_SIZE, stdin);message.messageType = 1;strcpy(message.buffer, buffer);if (msgsnd(messageID, (void*)&message, BUFFER_SIZE, 0) == -1) {fprintf(stderr, "Message send failed!\n");abort();}usleep(100);if (!strncmp(message.buffer, "finish", 6)) {break;}}return 0;
}
相关函数
msgget()
- 函数原型
int msgget(key_t key, int msgflg);
- 参数
- key为消息队列关联键
- msgflg为消息队列的建立标志和存取权限
- 返回值
成功返回消息队列标识值,否则返回-1
- 功能
用于创建一个新的或打开一个已经存在的消息队列
msgrcv()
- 函数原型
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
- 参数
- msqid为消息队列的识别码
- msgp是指向消息缓冲区的指针
- msgtyp为消息类型
msgtyp等于0 则返回队列的最早的一个消息。
msgtyp大于0,则返回其类型为msgtyp的第一个消息。
msgtyp小于0,则返回其类型小于或等于mtype参数的绝对值的最小的一个消息。- msgflg:这个参数依然是控制函数行为的标志,取值可以是:0,表示忽略
- 返回值
成功返回拷贝到mtext数组的实际字节数,否则返回-1
- 功能
从消息队列中读取消息
msgsnd()
- 函数原型
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
- 参数
- msqid为消息队列的识别码
- msgp是指向消息缓冲区的指针
- msgtyp为消息类型
msgtyp等于0 则返回队列的最早的一个消息。
msgtyp大于0,则返回其类型为msgtyp的第一个消息。
msgtyp小于0,则返回其类型小于或等于mtype参数的绝对值的最小的一个消息。- msgflg:这个参数依然是控制函数行为的标志,取值可以是:0,表示忽略
- 返回值
成功返回0,否则返回-1
- 功能
将一个新的消息写入队列
编译
- 注意编译的文件名与实现代码文件名保持一致
g++ Receiver.cpp -o Receiver
g++ Sender.cpp -o Sender
./Receiver & ./Sender
测试结果
Send data:This
Receive data: This
Send data:is
Receive data: is
Send data:sender
Receive data: sender
Send data:finish
Receive data: finish
鸣谢
百度百科
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
发布评论