提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
要求
完成环形缓冲区函数库封装,生成成静态库和动态库,编写测试程序验证库文件,编写makefile实现编译,要求实现函数:
a、缓冲区初始化
b、往缓冲区写数据;
c、从缓冲区读数据;
d、计算缓冲区数据长度;
e、销毁缓冲区;
需要考虑到多个用户同时读写的情况,用到锁机制(互斥量)。
一、环形缓冲区
关于什么是环形缓冲区,这里就不介绍了,网上大量文章都会介绍,读几篇基本就了解了。
参考:
C语言实现环形缓冲区
环形缓冲区ring_buffer的c语言实现
【数据结构及算法】环形缓冲区(ring buffer)实现原理及代码实现(C语言)
不罗嗦,直接上代码。
二、环形缓冲区实现(C语言)
1. ringBuf.h
#ifndef _RINGBUF_H
#define _RINGBUF_H
#define read 0
#define write 1
#define quit 2
#define length 3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct ringBuf
{
char *buffer; /*缓冲区的数据*/
int size; /*缓冲区大小*/
int pRead; /*读指针,名义上的指针,只是为了记录位置而已*/
int pWrite; /*写指针,名义上的指针,只是为了记录位置而已*/
};
/*先不考虑互斥锁*/
/*先不考虑写覆盖和读重复问题,后续设计有效数据记录变量来解决*/
struct ringBuf *ringBufInit(struct ringBuf *ringBuffer,int size);
int ringBufRead(struct ringBuf *ringBuffer,char *readBuf,int readLength);
int ringBufWrite(struct ringBuf *ringBuffer,char *writeBuf,int writeLength);
int ringBufDataLen(struct ringBuf *ringBuffer);
void ringBufFree(struct ringBuf *ringBuffer);
int cmdHand(char *cmd);
#endif
2. ringBufInit.c
#include "ringBuf.h"
#include <stdlib.h>
/*环形缓冲区初始化函数*/
/*不使用全局变量,将环形缓冲区结构体返回*/
struct ringBuf *ringBufInit(struct ringBuf* ringBuffer,int size)
{
ringBuffer = (struct ringBuf*)malloc(sizeof(struct ringBuf));
if(NULL == ringBuffer)
{
printf("ringBuffer malloc error!\n");
exit(-1);
}
memset(ringBuffer,0,sizeof(struct ringBuf));
ringBuffer->buffer = (char*)malloc(size);
memset(ringBuffer->buffer,0,size);
ringBuffer->size = size;
ringBuffer->pRead = 0;
ringBuffer->pWrite = 0;
return ringBuffer;
}
3. ringBufRead.c
#include "ringBuf.h"
/*从环形缓冲区读数据*/
int ringBu