环形buffer的应用

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <string.h>
typedef unsigned int UINT32;
typedef void VOID;
typedef struct tag_RING_BUF2_st
{
    UINT32 PosPut;
    UINT32 PosGet;
    UINT32 BufSize;  /* BufSize < MAX_RING_BUF_SIZE ,而且为2的幂 */
    VOID   **Buf;
}RING_BUF2;
#define NST_TRUE    1
#define NST_FALSE   0
#define RingBuf2Init(pRingBuf, ppBuf, BufMask)              \
{\
    (pRingBuf)->PosGet = 0;\
    (pRingBuf)->PosPut = 0;\
    (pRingBuf)->BufSize = ((BufMask) + 1);\
    (pRingBuf)->Buf     = (VOID **)(ppBuf);\
}

#define RingBufIsFull(pRingBuf) ((((pRingBuf)->PosPut - (pRingBuf)->PosGet) >= ((pRingBuf)->BufSize))? (NST_TRUE): (NST_FALSE))
#define RingBufIsEmpty(pRingBuf) (((pRingBuf)->PosGet == (pRingBuf)->PosPut)? (NST_TRUE): (NST_FALSE))
	
#define RingBufPeek(pRingBuf, pBufHead)              \
{   \
    if ((pRingBuf)->PosGet == (pRingBuf)->PosPut)   \
    {   \
        (pBufHead) = NULL;    \
    }   \
    else    \
    {   \
        (pBufHead) = (pRingBuf)->Buf[(pRingBuf)->PosGet & ((pRingBuf)->BufSize - 1)]; \
    }   \
}

#define RingBufGet(pRingBuf, pBufHead)              \
{\
    if ((pRingBuf)->PosGet == (pRingBuf)->PosPut)\
    {\
        (pBufHead) = NULL;\
    }\
    else\
    {\
        pBufHead = (pRingBuf)->Buf[(pRingBuf)->PosGet & ((pRingBuf)->BufSize - 1)];\
        (pRingBuf)->PosGet ++;\
    }\
}

#define RingBufPut(pRingBuf, pToBufTail)              \
{\
    if (((pRingBuf)->PosPut - (pRingBuf)->PosGet) < ((pRingBuf)->BufSize))\
    {\
        (pRingBuf)->Buf[(pRingBuf)->PosPut & ((pRingBuf)->BufSize - 1)] = (VOID *)(pToBufTail);\
        (pRingBuf)->PosPut ++;\
    }\
}
#define buffer_size  16
typedef struct _my_data {
	char name[10];
	int age;
}my_data;
int cmd = 0;
char name_g[10];
int age;
RING_BUF2 *pRingBuf = NULL;
my_data *ppbuf[buffer_size];
void ring_buffer_read(int num);
int main(int argc,char **argv)
{
	pRingBuf =(RING_BUF2*)malloc(sizeof(pRingBuf));
	memset(ppbuf,0,sizeof(ppbuf));
	int age = 0;
	signal(SIGRTMIN , ring_buffer_read);
	RingBuf2Init(pRingBuf, &ppbuf, buffer_size - 1);
	while(1)
	{
		printf("cmd<1 put,2 get> name age\n");
		scanf("%d",&cmd);
		if(cmd == 1) {
			scanf("%s",name_g);
			scanf("%d",&age);
		}
		printf("put:%d,name:%s,age:%d \n",cmd,name_g,age);
		kill(getpid(),SIGRTMIN);
	}
}

void ring_buffer_read(int num)
{
		switch(cmd) 
			{
				case 1: //input data
				{
					my_data *tmp = malloc(sizeof(my_data));
					strncpy(tmp->name,name_g,sizeof(name_g));
					tmp->age = age;
					if(!RingBufIsFull(pRingBuf))
					{
						RingBufPut(pRingBuf, tmp);
					}else {
						printf("buffer is full\n");
					}
					break;
				}
				case 2: 
				{
					my_data *tmp =NULL;
					if(!RingBufIsEmpty(pRingBuf))
					{
						RingBufGet(pRingBuf, tmp);
						if(tmp != NULL)
						{
							printf("get: name :%s,age:%d\n",tmp->name,tmp->age);
							free(tmp);
						}
					}else {
						printf("buffer is empty\n");
					}
					break;
				}
			   default :
					printf("input error \n");
					break;
			}
}

猜你喜欢

转载自blog.csdn.net/dachunfree/article/details/80355162