#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; } }
环形buffer的应用
猜你喜欢
转载自blog.csdn.net/dachunfree/article/details/80355162
今日推荐
周排行