消息队列是Linux进程间通信的一种方式,它是消息的链表,存放在内核中并由键值标识。
- 创建/获取消息队列:msgget()
函数原型:int msgget(key\_t key, int msgflg)
参数:
- key:消息队列的键值,由ftok获得。
- msgflg:标志位,用于指定消息队列的权限。
返回值:成功返回消息队列的ID,失败返回-1。
- 控制消息队列:msgctl()
函数原型:int msgctl(int msqid, int cmd, struct msqid\_ds *buf)
参数:
- msqid:消息队列的ID。
- cmd:要执行的操作。
- buf:指向消息队列的缓冲区。
返回值:成功返回0,失败返回-1。
- 添加消息到消息队列:msgsnd()
函数原型:int msgsnd(int msqid, const void *msgp, size\_t msgsz, int msgflg)
参数:
- msqid:消息队列的ID。
- msgp:指向要发送的消息的指针。
- msgsz:消息的大小。
- msgflg:标志位,一般为0。
返回值:成功返回0,失败返回-1。
- 从消息队列接收消息:msgrcv()
函数原型:ssize\_t msgrcv(int msqid, void *msgp, size\_t msgsz, long msgtyp, int msgflg)
参数:
- msqid:消息队列的ID。
- msgp:指向接收消息的缓冲区。
- msgsz:消息的大小。
- msgtyp:控制要接收的消息类型。
- msgflg:标志位,一般为0。
返回值:返回放到消息缓冲区的字节数,失败返回-1。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#define MSGKEY 1234
struct my_msg_st {
long my_msg_type;
char some_text[100];
};
int main() {
key_t key = MSGKEY;
int msgid;
struct my_msg_st msg_snd, msg_rcv;
// 创建消息队列
msgid = msgget(key, 0666 | IPC_CREAT);
if (msgid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
// 添加消息到消息队列
msg_snd.my_msg_type = 1;
strcpy(msg_snd.some_text, "Hello, Message Queue!");
if (msgsnd(msgid, &msg_snd, sizeof(msg_snd.some_text), 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
// 从消息队列接收消息
if (msgrcv(msgid, &msg_rcv, sizeof(msg_rcv.some_text), 1, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
// 输出接收到的消息
printf("Message received: %s\n", msg_rcv.some_text);
// 删除消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1