linux 消息队列 c语言
时间: 2023-07-26 11:17:34 浏览: 77
Linux 消息队列是一种进程间通信机制,可以让不同的进程通过消息传递来实现数据交换。在 C 语言中,我们可以使用系统调用函数 `msgget`、`msgsnd`、`msgrcv` 和 `msgctl` 来创建和操作消息队列。下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
#include <unistd.h>
#define MAX_MSG_SIZE 1024
struct message {
long mtype;
char mtext[MAX_MSG_SIZE];
};
int main() {
int msgid;
key_t key = ftok(".", 'a'); // 生成消息队列的 key
struct message msg;
// 创建/获取消息队列
if ((msgid = msgget(key, IPC_CREAT|0666)) == -1) {
perror("msgget error");
exit(1);
}
// 发送消息
msg.mtype = 1;
strcpy(msg.mtext, "Hello world");
if (msgsnd(msgid, &msg, strlen(msg.mtext)+1, 0) == -1) {
perror("msgsnd error");
exit(1);
}
// 接收消息
if (msgrcv(msgid, &msg, MAX_MSG_SIZE, 1, 0) == -1) {
perror("msgrcv error");
exit(1);
}
printf("Received message: %s\n", msg.mtext);
// 删除消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl error");
exit(1);
}
return 0;
}
```
在以上代码中,我们使用 `ftok` 函数生成消息队列的 key,然后通过 `msgget` 函数创建(或获取)消息队列。接着,我们使用 `msgsnd` 函数向消息队列中发送消息,使用 `msgrcv` 函数从消息队列中接收消息。最后,我们使用 `msgctl` 函数删除消息队列。
需要注意的是,消息队列中的消息有类型(type),我们可以根据类型来接收消息,这样可以避免接收到不需要的消息。在发送消息时,我们需要指定消息类型,使用 `msgsnd` 函数的第三个参数指定消息长度(包括结构体 `message` 中的 `mtype` 和 `mtext`),使用 `msgrcv` 函数的第三个参数指定最大接收消息长度,使用第四个参数指定接收的消息类型。
阅读全文