实现posix消息队列示例分享


下面是一个使用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`。