一、消息队列的介绍
消息队列的实现原理是将消息存储在一个队列中,生产者将消息放入队列的尾部,消费者从队列的头部取出消息进行处理。消息队列通常采用先进先出(FIFO)的方式进行消息的存储和处理。消息队列可以实现异步通信,提高系统的可靠性和可扩展性。
具体实现上,消息队列通常由以下几个组件构成:
消息队列:用于存储消息的队列。
生产者:向消息队列中添加消息的组件。
消费者:从消息队列中取出消息并进行处理的组件。
二、消息队列的测试
手写一个简单的消息队列进行测试。功能比较简单,发送5条数据,读取5条数据。
#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 10
struct myBuf
{
char *buf;
int len;
};
struct test
{
int head;
int tail;
struct myBuf idT[MAXNUM];
};
struct test testFifo;
int testFifoInit(void)
{
int i;
testFifo.head=0;
testFifo.tail=0;
for(i=0;i<MAXNUM;i++)
{
testFifo.idT[i].buf=(char *)malloc(100);
if(testFifo.idT[i].buf == NULL)
return -1;
testFifo.idT[i].len=0;
}
return 0;
}
int testFifoClose(void)
{
int i;
for(i=0;i<MAXNUM;i++)
{
if(testFifo.idT[i].buf == NULL)
continue;
free(testFifo.idT[i].buf);
}
return 0;
}
int testFifoIsEmpty(void)
{
//加锁
if(testFifo.head == testFifo.tail )
return -1;
else
return 0;
}
int testFifoIsFull(void)
{
//加锁
if((testFifo.head % MAXNUM) != ((testFifo.tail+1)% MAXNUM) )
return 0;
else
return -1;
}
int testFifoPut(char *buf,int len)
{
//加锁
if(testFifoIsFull() == -1)
return -1;
memset(testFifo.idT[testFifo.tail].buf,0,len);
memcpy(testFifo.idT[testFifo.tail].buf,buf,len);
testFifo.idT[testFifo.tail].len=len;
testFifo.tail = (testFifo.tail+1)%MAXNUM;
}
int testFifoGet(char *buf)
{
//加锁
if(testFifoIsEmpty() == -1)
return -1;
memcpy(buf,testFifo.idT[testFifo.head].buf,testFifo.idT[testFifo.head].len);
testFifo.head = (testFifo.head+1)%MAXNUM;
return 0;
}
struct test testTemp;
int main(int argv,char *argc[])
{
char bufSend[20]="hello world";
char bufRx[20]={0};
int i=0;
if(testFifoInit()== -1)
{
printf("创建失败\n");
}
while(1)
{
sprintf(bufSend,"hello world %d",i++);
printf("send=%s\n",bufSend);
testFifoPut(bufSend,strlen(bufSend));
if(i%5 == 0)
{
while(1)
{
if(testFifoGet(bufRx) == -1)
break;
printf("rx=%s\n",bufRx);
memset(bufRx,0,sizeof(bufRx));
}
}
sleep(2);
}
testFifoClose();
return 0;
}
欢迎关注公众号:嵌入式学习与实践