本质:
消息队列是消息的列表,存放在内存中,由内核维护。
作用:
实现多个任务(进程)之间的通信,随机存放。
特点:
- 消息队列中消息有类型;
- 消息队列中消息有格式;
- 实现消息的随机查询(指的是不同类型);
- 允许一个或多个进程同时收发(多对多通信);
- 消息一次性(读出会删除);
- 每个消息有系统唯一的消息标识符;
常见命令:
linux中查看系统消息队列 ipcs -q
linux中删除系统消息队列 ipcrm -q 消息队列号
linux中查看消息队列的限制值 ipcs -ql
创建和使用:
步骤一
获取创建消息队列所需的key值
步骤二
使用msgget函数创建或打开一个消息队列,并返回消息队列ID(msgid)。
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>
int main()
{
//只要能保证多个进程通信key值一样,打开的队列就是同一个
key_t key= ftok("./",2023);
int msgid = msgget(key,IPC_CREAT|0666);
printf("msgid = %d\n",msgid);
}
步骤三
将id为0的删除,重新创建才能正常使用
步骤四
写消息队列
格式
发送消息
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <string.h>
typedef struct _msg
{
long mtype;
char mtext[1024];
}MSG;
int main()
{
//只要能保证多个进程通信key值一样,打开的队列就是同一个
key_t key= ftok("./",2023);
int msgid = msgget(key,IPC_CREAT|0666);
printf("msgid = %d\n",msgid);
MSG mymsg;
mymsg.mtype=10;
strcpy(mymsg.mtext,"hello world");
int ret = msgsnd(msgid,(void*)&mymsg,sizeof(MSG)-sizeof(long),0);
if(ret == 0)
printf("send ok\n");
}
步骤五
读消息
格式
接收消息
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <string.h>
typedef struct _msg
{
long mtype;
char mtext[1024];
}MSG;
int main()
{
//只要能保证多个进程通信key值一样,打开的队列就是同一个
key_t key= ftok("./",2023);
int msgid = msgget(key,IPC_CREAT|0666);
printf("msgid = %d\n",msgid);
MSG rcvmsg;
msgrcv(msgid,(void*)&rcvmsg,sizeof(MSG)-sizeof(long),10,0);
printf("recv:%s\n",rcvmsg.mtext);
}