消息队列概念
消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列也有管道一样的不足,就是每个数据块的最大长度是有上限的,系统上全体队列的最大总长度也有一个上限
消息队列函数操作
创建一个消息队列,最后进行删除队列
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
int main(int argc,char *argv)
{
int msgid = msgget((key_t)1234,0);
if(msgid == -1)
{
msgid = msgget((key_t)1234,IPC_CREAT|0766);
}
printf("msgid = %d\n",msgid);
msgctl(msgid,IPC_RMID,NULL);
return 0;
}
消息队列的写和读
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
typedef struct data
{
long i_type;
char buf[1024];
}data_t;
int main(int argc,char *argv)
{
int msgid = msgget((key_t)1234,0);
if(msgid == -1)
{
msgid = msgget((key_t)1234,IPC_CREAT|0766);
}
printf("msgid = %d\n",msgid);
//发送消息队列
data_t data;
memset(&data,0,sizeof(data_t));
data.i_type = 1;
strcpy(data.buf,"helloworld");
int ret = msgsnd(msgid,(void *)&data,sizeof(data_t)-sizeof(long),0);
if(ret == 0)
{
printf("send succes\n");
}
//读取消息队列
data_t rdata;
memset(&rdata,0,sizeof(data_t));
int rsize = msgrcv(msgid,(void *)&rdata,sizeof(data_t)-sizeof(long),1,0);
printf("read datasize = %d, data = %s\n",rsize,rdata.buf);
msgctl(msgid,IPC_RMID,NULL);
return 0;
}
运行结果如下: