下面是一个使用POSIX消息队列的简单示例,展示了如何创建消息队列、发送消息到队列、从队列接收消息以及删除消息队列。这个示例使用了C语言,并假设你已经有基本的C语言编程和POSIX系统调用知识。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// 定义消息类型
#define MSG_TYPE 1
// 定义消息结构
struct my_msgbuf {
long mtype; // 消息类型
char mtext[256]; // 消息正文
};
int main() {
key_t key;
int msgid;
struct my_msgbuf buf;
// 生成唯一的key
key = ftok("/tmp", 'R');
if (key == (key_t)-1) {
perror("ftok");
exit(1);
}
// 创建消息队列
msgid = msgget(key, 0666 | IPC_CREAT);
if (msgid == -1) {
perror("msgget");
exit(1);
}
// 发送消息
strcpy(buf.mtext, "Hello, POSIX message queue!");
buf.mtype = MSG_TYPE;
if (msgsnd(msgid, &buf, strlen(buf.mtext) + 1, 0) == -1) {
perror("msgsnd");
exit(1);
}
// 接收消息
memset(&buf, 0, sizeof(buf));
if (msgrcv(msgid, &buf, sizeof(buf.mtext), MSG_TYPE, 0) == -1) {
perror("msgrcv");
exit(1);
}
printf("Received: %s\n", buf.mtext);
// 删除消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(1);
}
return 0;
}
**说明**:
1. **ftok**:生成一个唯一的key,用于标识消息队列。这里使用了`/tmp`目录和字符`'R'`作为参数。
2. **msgget**:使用生成的key创建一个新的消息队列,或者获取一个已存在的消息队列的标识符。
3. **msgsnd**:向消息队列发送消息。这里发送了一个简单的字符串消息。
4. **msgrcv**:从消息队列接收消息。这里指定了消息类型为`MSG_TYPE`。
5. **msgctl**:删除消息队列。
请确保你的环境支持POSIX消息队列,并且你有足够的权限去创建和删除IPC对象。此外,编译这个示例时,请确保链接了实时库(通常是`-lrt`),因为`ftok`、`msgget`、`msgsnd`、`msgrcv`和`msgctl`等函数定义在这个库中。例如,如果你使用gcc编译器,编译命令可能类似于`gcc -o msgq_example msgq_example.c -lrt`。