概述
消息队列是消息的链表,存放在内存中,由内核维护
特点
消息队列·操作命令
ipcs -q 获取消息队列信息
ipcrm -q msgid 删除消息队列id为msgid的消息队列
获取key值
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
int main(int argc, char const *argv[])
{
key_t key01 = ftok("./",2023);
key_t key02 = ftok("./",2023);
key_t key03 = ftok("./",2022);
printf("key1=%u\n",key01);
printf("key2=%u\n",key02);
printf("key3=%u\n",key03);
return 0;
} 创建和获取消息队列-msgget函数
作用:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
int main(int argc, char const *argv[])
{key_t key = ftok("./",12);printf("ipc键值是:%d\n",key);int msgid = msgget(key,IPC_CREAT |0666);printf("消息队列id:%d\n",msgid);key_t key2 = ftok("./",13);int msgid2 = msgget(key2,IPC_EXCL);//查看消息队列是否存在printf("消息队列id2:%d\n",msgid2);return 0;
} 消息格式
发送消息-msgsnd函数
接收消息-msgrcv
案例1:简单的消息收发
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
typedef struct struct_msg{
long msgType;
char name[20];
char text[128];
}Msg;
int main(int argc, char const *argv[])
{
//获取key值
key_t key = ftok("./",258);
//创建或获取消息对象
int msgid = msgget(key,IPC_CREAT| 0666);
//准备要发送的消息
Msg msg01 = {10,"张三","你好 李四"};
Msg msg02;
msg02.msgType=20;
strcpy(msg02.name,"张三");
strcpy(msg02.text,"你好 王五");
//发送消息给李四
msgsnd(msgid,&msg01,sizeof(msg01) - sizeof(long),0);
//发现消息给王五
msgsnd(msgid,&msg02,sizeof(msg01) - sizeof(long),0);
return 0;
} #include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
typedef struct struct_msg{
long msgType;
char name[20];
char text[128];
}Msg;
int main(int argc, char const *argv[])
{
key_t key = ftok("./",258);
int msqid = msgget(key,IPC_CREAT|0666);
Msg msg;
msgrcv(msqid,&msg,sizeof(msg)-sizeof(long),10,0);
printf("李四接收到的消息为\n");
printf("姓名:%s说%s\n",msg.name,msg.text);
return 0;
} 代码03——ww.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
typedef struct struct_msg{
long msgType;
char name[20];
char text[128];
}Msg;
int main(int argc, char const *argv[])
{
key_t key = ftok("./",258);
int msqid = msgget(key,IPC_CREAT|0666);
Msg msg;
msgrcv(msqid,&msg,sizeof(msg)-sizeof(long),20,0);
printf("王五接收到的消息为\n");
printf("姓名:%s说%s\n",msg.name,msg.text);
return 0;
} 消息队列控制(了解)
案例2:多人聊天程序
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
typedef struct INFO
{long type;char name[20];char text[128];
}info;
int main(int argc, char const *argv[])
{printf("请输入用户姓名:\n");char name[50] = {0};scanf("%s",name);int stype = 0;printf("请输入要发送的类型:\n");scanf("%d",&stype);int rtype = 0;printf("请输入要接受的数据类型:\n");scanf("%d",&rtype);//创建消息队列key_t key = ftok("./",11) ;int mesid = msgget(key,IPC_CREAT | 0666);printf("mesid=%d\n",mesid);int i = 0;for(i = 0;i < 2;i++){int pid = fork();if(pid == 0){break;}}if(i == 0){while(1){info inf;msgrcv(mesid,&inf,sizeof(info)-sizeof(long),rtype,0);printf("%s:%s\n",inf.name,inf.text);if(strcmp("886",inf.text) == 0){break;}printf("111\n");}_exit(0);}else if(i == 1){while(1){printf("222\n"); info inf;scanf("%s",inf.text);inf.type = stype;strcpy(inf.name,name);msgsnd(mesid,&inf,sizeof(info)-sizeof(long),0);if(strcmp("886",inf.text) == 0){break;}}_exit(0);}else if(i == 2){while(1){int pid = waitpid(-1,NULL,WNOHANG);if(pid == -1){break;}}}return 0;
}