目录
1.特点
消息队列是IPC对象(活动在内核级别的一种进程间通信的工具)的一种
一个消息队列由一个标识符 (即队列ID)来标识
消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等
消息队列可以按照类型(自己设一个值作为类型)来发送/接收消息
ipcs -q : 查看消息队列
ipcrm -q msgid : 删除指定的消息队列
2.函数接口
2.1创建/打开消息队列
2.2添加消息
2.3读取消息
2.4删除消息队列
3.操作步骤
(1) 产生key值: ftok()
(2) 创建或打开消息队列msgget()
(3) 添加消息:按照类型把消息添加到以及打开的消息队列末尾msgsnd()
(4) 读取消息:可以按照类型把消息从队列中给你读走msgrcv()
(5) 删除消息队列:msgctl()
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
struct msgbuf
{
long type; // 消息类型
int num; // 消息内容
char ch;
};
int main(int argc, char const *argv[])
{
int msgid;
// 创建key值
key_t key;
key = ftok("msg.c", 'd');
if (key < 0)
{
perror("key error");
return -1;
}
printf("key:%#x\n", key);
// 打开或创建消息队列
msgid = msgget(key, IPC_CREAT | IPC_EXCL | 0666);
if (msgid <= 0)
{
if (errno == EEXIST) // 如果已存在则直接打开
{
msgid = msgget(key, 0666); // 直接打开,返回消息队列id
}
else
{
perror("msgget err");
return -1;
}
}
printf("msgid:%d \n", msgid);
// 定义消息结构体变量 msg,用来存放要添加的消息
struct msgbuf msg;
// 添加消息1
msg.type = 1; // 定义类型为1的消息类型
msg.num = 10; // 消息内容 10
msg.ch = 'a'; // 消息内容 a
msgsnd(msgid, &msg, sizeof(msg) - sizeof(long), 0);
// 添加消息2
msg.type = 2; // 定义类型为2的消息类型
msg.num = 20; // 消息内容 20
msg.ch = 'b'; // 消息内容 b
msgsnd(msgid, &msg, sizeof(msg) - sizeof(long), 0);
// 读取消息
// 定义消息结构体变量,用来存放读取的消息
struct msgbuf m;
// 读取消息类型为1的消息
msgrcv(msgid, &m, sizeof(m) - sizeof(long), 1, 0);
printf("%d %c \n", m.num, m.ch);
// 读取消息类型为2的消息
msgrcv(msgid, &m, sizeof(m) - sizeof(long), 2, 0);
printf("%d %c \n", m.num, m.ch);
msgctl(msgid, IPC_RMID, NULL);
return 0;
}