#include <stdio.h>
#include <string.h>
#include <malloc.h>//因此使用ring buffer关键因素是数据缓冲区、数据缓冲区长度、head索引、tail索引
typedef struct {char *buff;int length;int head;int tail;
}ring_buffer_t;//创建、初始化ring buffer
ring_buffer_t *ring_buffer_create_init(int ring_buffer_length)
{ring_buffer_t *tmp_ring_buffer = (ring_buffer_t *)malloc(sizeof(ring_buffer_t));tmp_ring_buffer->buff = (char *)malloc(ring_buffer_length);memset(tmp_ring_buffer->buff, 0, ring_buffer_length);tmp_ring_buffer->head = 0;tmp_ring_buffer->tail = 0;tmp_ring_buffer->length = ring_buffer_length;return tmp_ring_buffer;
}//判断当前有无数据可读,用于读操作前的判断
//如果当前要写入的位置和可读位置相同,则判定无数据可读
bool ring_buffer_empty(ring_buffer_t *ring_buffer)
{return (ring_buffer->head == ring_buffer->tail);
}//判断当前ring buffer是否满了,用于写操作前的判断
//如果要写的位置紧挨在可读位置后面,则判定为满
bool ring_buffer_full(ring_buffer_t *ring_buffer)
{int tmp_len = ring_buffer->head - ring_buffer->tail;if((-1 == tmp_len) || (ring_buffer->length -1 == tmp_len)){return true;}else{return false;}
}//写一个字节到ring buffer,如果ring buffer满了head、tail递增,覆盖旧数据
void write_ring_buffer_byte(ring_buffer_t *ring_buffer, char data)
{//此处控制如果有写入操作后,当写快于读时,head和tail也不会相等,即不会判断无数据可读if(ring_buffer_full(ring_buffer)){ring_buffer->tail++;if(ring_buffer->tail == ring_buffer->length){ring_buffer->tail = 0;}}ring_buffer->buff[ring_buffer->head] = data;ring_buffer->head++;if(ring_buffer->head == ring_buffer->length){ring_buffer->head = 0;}
}//读一个字节
int read_ring_buffer_byte(ring_buffer_t *ring_buffer, char *data)
{if(ring_buffer_empty(ring_buffer)){return -1;}*data = ring_buffer->buff[ring_buffer->tail];ring_buffer->tail++;if(ring_buffer->tail == ring_buffer->length){ring_buffer->tail = 0;}return 0;
}//写buffer时即一个个字节写
void write_ring_buffer_data(ring_buffer_t *ring_buffer, char *data, int size)
{for(int i = 0;i < size;i++){write_ring_buffer_byte(ring_buffer, *(data + i));//printf("[%s]data:[%s]\n", __func__, ring_buffer->buff);}
}//读buffer时即一个个字节读
int read_ring_buffer_data(ring_buffer_t *ring_buffer, char *data, int size)
{for(int i = 0; i < size; i++){if(-1 == read_ring_buffer_byte(ring_buffer, data + i)){return -1;}//printf("[%s]read data:[%s]\n", __func__, data);}return 0;
}//测试程序
void main(void)
{int i;char tmp_write[40] = "abcdefghijklmnopquio";char tmp_read[40] = {0};ring_buffer_t *ring_buffer = ring_buffer_create_init(20);  //10、50#if 0for(i = 0;i < strlen(tmp_write); i++){write_ring_buffer_byte(ring_buffer, *(tmp_write + i));printf("write_buff:[%s]\n", ring_buffer->buff);}for(i = 0;i < 20; i++){read_ring_buffer_byte(ring_buffer, tmp_read+i);printf("read_buff:[%s]\n", tmp_read);}
#endifwrite_ring_buffer_data(ring_buffer, tmp_write, strlen(tmp_write));printf("write data:[%s]\n", ring_buffer->buff);read_ring_buffer_data(ring_buffer, tmp_read, sizeof(tmp_read));printf("read_buff:[%s]\n", tmp_read);
}

环形存储(ring buffer):一个头尾相连的buffer,根据head索引确定写入位置,根据tail索引确定读出位置,读写时head、tail索引各自递增,不够空间且有新数据要写入时,覆盖旧数据。
下图演示了创建/初始化长度12、写4bytes数据、读2bytes数据时,ring buffer的head、tail索引变化情况。

ring buffer相关推荐

  1. SQL Server 环形缓冲区(Ring Buffer) -- 介绍

    SQL Server 环形缓冲区(Ring Buffer) -- 介绍 以下关于Ring Buffer的介绍转载自: http://zh.wikipedia.org/wiki/%E7%92%B0%E5 ...

  2. leetcode 622. Design Circular Queue | 622. 设计循环队列(Ring Buffer)

    题目 https://leetcode.com/problems/design-circular-queue/ 题解 Ring Buffer 的实现,rear 指向新插入的位置,front 指向最旧的 ...

  3. Java 环形缓冲器(Ring Buffer)

    环形缓冲器(Ring Buffer):环形队列,这里使用数组实现,但并未用上环形功能,因为设置了队满直接出队清空队列,如果只读取部分数据,又或者想要覆盖冲写,则可以用上环形功能 package cha ...

  4. SQL Server 环形缓冲区(Ring Buffer) -- 环形缓冲在AlwaysOn的应用

    SQL Server 环形缓冲区(Ring Buffer) -- 环形缓冲在AlwaysOn的应用 可以从SQL Server环形缓冲区得到一些诊断AlwaysOn的信息,或从sys.dm_os_ri ...

  5. 解析Disruptor:写入ring buffer

    原文地址http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-writing-to-ring.html 这是Disruptor end ...

  6. linux+循环buffer,说说循环缓冲区(Ring Buffer)

    关于循环缓冲区(Ring Buffer)的概念,其实来自于Linux内核(Maybe),是为解决某些特殊情况下的竞争问题提供了一种免锁的方法.这种特殊的情况就是当生产者和消费者都只有一个,而在其它情况 ...

  7. Ring Buffer (circular Buffer)环形缓冲区简介

    https://blog.csdn.net/langeldep/article/details/8888582 关于环形缓冲区的知识,请看这里 http://en.wikipedia.org/wiki ...

  8. Linux ftrace 1.1、ring buffer

    1.简介 ringbuffer是trace框架的一个基础,所有的trace原始数据都是通过ringbuffer记录的.ringbuffer的作用主要有几个: 1.存储在内存中,速度非常快,对系统性能的 ...

  9. 网卡的 Ring Buffer 详解

    网卡的 Ring Buffer 详解 1. 网卡处理数据包流程 网卡处理网络数据流程图: 图片来自参考链接1 上图中虚线步骤的解释: DMA 将 NIC 接收的数据包逐个写入 sk_buff ,一个数 ...

  10. Ring Buffer 的应用

    origin: http://blog.codingnow.com/2012/02/ring_buffer.html 这是一篇命题作文,源于今天在微薄上的一系列讨(好吧,也可以说是吵架).其实方案没有 ...

最新文章

  1. 密码统计分析工具pipal
  2. java如何调windows框_java – JDialog.setAlwaysOnTop(true)将所有对话框带到Windows下的前面...
  3. HTML5 API详解(13):video/audio 视频/音频
  4. 八年数据库之路的感悟
  5. python中str函数isdigit、isdecimal、isnumeric的区别
  6. Javascript 立即执行函数
  7. 《统计学习方法》——提升算法
  8. 支付宝H5支付,ISV权限不足
  9. Openfile安装和使用
  10. c语言鼠标滚动条,xtraScrollableControl 滚动条随鼠标滚动
  11. 行列式与矩阵树定理入门
  12. photoshop ps 替换图片文字
  13. Java中涉及到和金钱有关的属性的类型
  14. 汽车数据流分析常采用哪些方法?
  15. C++实现视频格式转换PC客户端工具(支持多任务,暂停,断点续转,删除等基本功能)
  16. 评论回复功能 asp.net_LR2021颜色分级功能让照片调色简单有趣好玩!最新尝鲜测试...
  17. 获取flask的app.route装饰器所有url
  18. s3c2440 uboot 移植 (四)支持环境变量在nandflash 存储
  19. macos重启docker
  20. Meltdown 论文翻译

热门文章

  1. 【Polelink北汇信息】EV初创公司如何降低软件开发成本和风险
  2. MySQL mdl导入_MySQL · 特性分析 · MDL 实现分析
  3. mysql mdl 锁_MySQL源码学习:MDL字典锁
  4. 简单的倒计时shell脚本
  5. 人机大战结局,为何日本公众的看法与我们不同?
  6. 连续1D空战辅助决策问题的DDPG实现
  7. 网易云音乐与QQ音乐的评测分析
  8. U盘数据恢复软件哪款好恢复效果好
  9. 股票买卖原则及方法之一
  10. 商品库存周转率详解及计算方式