先进先出,保证信息的有序性。
函数:msgget(搭配ftok)、msgsnd、msgrcv、msgctl
实现流程:
1、创建消息队列IPC对象 msgget
2、通信(内置函数:msgsnd、msgrcv)
3、删除消息队列IPC对象 msgctl
write.c
/*===============================================
* 文件名称:write.c
* 创 建 者:cxy
* 创建日期:2024年02月07日
* 描 述:
================================================*/
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>typedef struct msgbuf{ long type; //区分通信的队列char data[100]; //通信内容
}MSG;int main(int argc, char *argv[])
{//1、创建消息队列IPC对象msgget//1.1 获取key值key_t key = ftok("/home",5);//1.2 创建消息队列IPC对象//获取消息队列ID号int msgid = msgget(key,IPC_CREAT|0664);//2、通信msgsndMSG msg_1 = {1,"hahaha"}; //队列1MSG msg_2 = {2,"heiheihei"}; //队列2MSG msg_3 = {3,"xixixi"}; //队列3MSG msg_4 = {1,"----hahaha----"}; //队列1msgsnd(msgid,&msg_1,sizeof(msg_1)-sizeof(long),0); //通信内容大小、权限可读可写msgsnd(msgid,&msg_2,sizeof(msg_2)-sizeof(long),0);msgsnd(msgid,&msg_3,sizeof(msg_3)-sizeof(long),0);msgsnd(msgid,&msg_4,sizeof(msg_4)-sizeof(long),0);//3、删除消息队列IPC对象msgctlmsgctl(msgid,IPC_RMID,NULL);return 0;
}
read.c
/*===============================================
* 文件名称:read.c
* 创 建 者:cxy
* 创建日期:2024年02月07日
* 描 述:
================================================*/
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>typedef struct msgbuf{ long type; //区分通信的队列char data[100]; //通信内容
}MSG;int main(int argc, char *argv[])
{//1、创建消息队列IPC对象msgget//1.1 获取key值key_t key = ftok("/home",5);//1.2 创建消息队列IPC对象//获取消息队列ID号int msgid = msgget(key,IPC_CREAT|0664);//2、通信msgrcvMSG mymsg_1;MSG mymsg_2;MSG mymsg_3;MSG mymsg_4;msgrcv(msgid,&mymsg_1,sizeof(MSG)-sizeof(long),3,0); //mymsg_1存储队列3信息msgrcv(msgid,&mymsg_2,sizeof(MSG)-sizeof(long),2,0); //mymsg_2存储队列2信息msgrcv(msgid,&mymsg_3,sizeof(MSG)-sizeof(long),1,0); //mymsg_3存储队列1信息msgrcv(msgid,&mymsg_4,sizeof(MSG)-sizeof(long),1,0); //mymsg_4存储队列1信息printf("%s\n",mymsg_1.data);printf("%s\n",mymsg_2.data);//按照发送顺序打印队列1中信息printf("%s\n",mymsg_3.data);printf("%s\n",mymsg_4.data);//3、删除消息队列IPC对象msgctlmsgctl(msgid,IPC_RMID,NULL);return 0;
}
结果:队列1证明了消息的有序性