写一个完整的C语言消息队列的程序代码
时间: 2024-01-21 22:19:39 浏览: 84
以下是一个简单的 C 语言消息队列的程序代码,包含了消息队列的创建、发送和接收功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#define MSG_KEY 1234
// 定义消息结构体
struct msgbuf {
long mtype; // 消息类型
char mtext[256]; // 消息正文
};
int main() {
int msgid, ret;
struct msgbuf msg;
// 创建消息队列
msgid = msgget(MSG_KEY, IPC_CREAT | 0666);
if (msgid < 0) {
perror("msgget");
return -1;
}
// 发送消息
msg.mtype = 1;
strcpy(msg.mtext, "Hello, world!");
ret = msgsnd(msgid, &msg, sizeof(msg.mtext), 0);
if (ret < 0) {
perror("msgsnd");
return -1;
}
// 接收消息
ret = msgrcv(msgid, &msg, sizeof(msg.mtext), 1, 0);
if (ret < 0) {
perror("msgrcv");
return -1;
}
printf("Received message: %s\n", msg.mtext);
// 删除消息队列
ret = msgctl(msgid, IPC_RMID, NULL);
if (ret < 0) {
perror("msgctl");
return -1;
}
return 0;
}
```
在该程序中,我们先定义了一个消息结构体 `msgbuf`,其中包含了消息的类型和正文。程序接着创建了一个消息队列,使用 `msgget` 函数,该函数返回一个消息队列的标识符 `msgid`,以后就可以用这个标识符进行消息队列的操作。
接着,程序通过 `msgsnd` 函数向消息队列中发送了一个消息。该函数的第一个参数是消息队列的标识符,第二个参数是指向消息结构体的指针,第三个参数是消息正文的长度,第四个参数是一个标志,一般设置为 0。
最后,程序通过 `msgrcv` 函数从消息队列中接收了一个消息。该函数的第一个参数是消息队列的标识符,第二个参数是指向消息结构体的指针,第三个参数是消息正文的长度,第四个参数是消息类型,表示要接收的消息类型。如果设置为 0,则表示接收队列中第一个消息。第五个参数是标志,一般设置为 0。
最后,程序通过 `msgctl` 函数删除了创建的消息队列。该函数的第一个参数是消息队列的标识符,第二个参数是删除命令,一般为 IPC_RMID,表示删除该消息队列。第三个参数是一个指向结构体的指针,一般设置为 NULL。
阅读全文