当前位置: 首页 > news >正文

【ringbuff share mem】

ringbuff 和share mem 结合实现PV操作

参考链接

https://juejin.cn/post/7113550346835722276
https://zhuanlan.zhihu.com/p/147826545

代码如下:

#include "rb.h"int g_shmid = 0;shm_buff * create_shm(int *smid)
{int id;shm_buff *share_mem = NULL;*smid = 0;id =  shmget((key_t)12345,sizeof(shm_buff),IPC_CREAT | IPC_EXCL | 0644);if(id == -1){printf("rm exist share mem\n");system("sudo ipcrm -M 12345");id =  shmget((key_t)12345,sizeof(shm_buff),IPC_CREAT | IPC_EXCL | 0644);if(id == -1){printf("creat share memory failed!\n");return NULL;}}share_mem = (shm_buff*)shmat(id,NULL,0);if(!share_mem){printf("share mem is NULL\n");return NULL;}*smid = id;share_mem->end = 0;#if 0for(u32 i = 0; i < MAX_LEN; i++)printf("ring_buff[%d]:addr:0x%lx\n",i,share_mem->ring_data[i].addr);#endifmemset(share_mem->ring_data, 0x0, sizeof(share_mem->ring_data));return share_mem;
}void destroy_shm(int id, void* shm_buff)
{shmdt((const void*)shm_buff);shmctl(id, IPC_RMID, 0);
}
int main(int argc, char** argv)
{int ret = 0;int shmid = 0;shm_buff* sm = create_shm(&shmid);if(!sm || !shmid)return -1;g_shmid = shmid;ret = ring_buff_init(&sm->buff, sm->ring_data, sizeof(sm->ring_data), sizeof(entry));if(ret){printf("ring_buff init fail ret:%d \n", ret);return ret;}int p = fork();if(p == 0){printf("g_shmid:%d \n", g_shmid);sleep(1);for(;;){if(sm->end && ring_buff_empty(&sm->buff))break;if(!ring_buff_empty(&sm->buff)){entry rdata;if(!ring_buff_read(&sm->buff, &rdata, 1))printf("buff is empty----------\n");elseprintf("data.addr:0x%lx size:0x%lx\n", rdata.addr, rdata.size);}else{//printf("wait p write data ...\n");//sleep(1);}}printf("read all done\n");//destroy_shm(shmid, sm);}else{int c = 0;printf("g_shmid:%d \n", g_shmid);for(int c = 0; c < 0x30;c++){if(!ring_buff_full(&sm->buff)){entry data;data.addr = c;data.size = 4;if(!ring_buff_write(&sm->buff, &data, 1)){printf("buff is full-----------------\n");}}else{printf("buff full wait c read data ...\n");sleep(1);}}sm->end = 1;sleep(2);}
}

头文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
#include<sys/types.h>
#include<sys/shm.h>
#include<sys/ipc.h>#define u32 unsigned int
#define u64 unsigned long#define MAX_LEN 0x10
#define MIN(a, b) ((a) < (b) ? (a) : (b))typedef struct entry_t
{u64 addr;u64 size;
}entry;struct ring_buff {volatile unsigned int   in;volatile unsigned int   out;volatile unsigned int   mask;volatile unsigned int   esize;volatile unsigned int   lock;void        *data;
};typedef struct shm_buff_t
{volatile unsigned int end;struct ring_buff buff;entry  ring_data[MAX_LEN];
}shm_buff;static inline void ring_buff_lock(struct ring_buff *buff)
{while(buff->lock);buff->lock = 1;
}static inline void ring_buff_unlock(struct ring_buff *buff)
{buff->lock = 0;
}static inline unsigned int ring_buff_len(struct ring_buff *buff)
{return buff->in - buff->out;
}static bool ring_buff_empty(struct ring_buff *buff)
{ring_buff_lock(buff);unsigned int l = ring_buff_len(buff);ring_buff_unlock(buff);return (l == 0) ? true:false;
}
static bool ring_buff_full(struct ring_buff *buff)
{ring_buff_lock(buff);unsigned int l = ring_buff_len(buff);ring_buff_unlock(buff);return l == (buff->mask + 1) ? true:false;
}static inline unsigned int ring_buff_unused(struct ring_buff *buff)
{return (buff->mask + 1) - (buff->in - buff->out);
}static int ring_buff_init(struct ring_buff *buff, void *buffer,unsigned int size, size_t esize)
{size /= esize;buff->in = 0;buff->out = 0;buff->lock = 0;buff->esize = esize;buff->data = buffer;if (size < 2) {buff->mask = 0;return -1;}buff->mask = size - 1;return 0;
}static void ring_buff_copy_in(struct ring_buff *buff, const void *src,unsigned int len, unsigned int off)
{unsigned int size = buff->mask + 1;unsigned int esize = buff->esize;unsigned int l;off &= buff->mask;if (esize != 1) {off *= esize;size *= esize;len *= esize;}l = MIN(len, size - off);memcpy(buff->data + off, src, l);memcpy(buff->data, src + l, len - l);/** make sure that the data in the buff is up to date before* incrementing the buff->in index counter*///smp_wmb();
}
static unsigned int ring_buff_write(struct ring_buff *buff,const void *buf, unsigned int len)
{unsigned int l;ring_buff_lock(buff);l = ring_buff_unused(buff);if (len > l)len = l;if(!len)return 0;ring_buff_copy_in(buff, buf, len, buff->in);buff->in += len;ring_buff_unlock(buff);return len;
}static void ring_buff_copy_out(struct ring_buff *buff, void *dst,unsigned int len, unsigned int off)
{unsigned int size = buff->mask + 1;unsigned int esize = buff->esize;unsigned int l;off &= buff->mask;if (esize != 1) {off *= esize;size *= esize;len *= esize;}l = MIN(len, size - off);memcpy(dst, buff->data + off, l);memcpy(dst + l, buff->data, len - l);/** make sure that the data is copied before* incrementing the buff->out index counter*///smp_wmb();
}static unsigned int ring_buff_out_peek(struct ring_buff *buff,void *buf, unsigned int len)
{unsigned int l;l = ring_buff_len(buff);if(!l)return 0;if (len > l)len = l;ring_buff_copy_out(buff, buf, len, buff->out);return len;
}
static unsigned int ring_buff_read(struct ring_buff *buff,void *buf, unsigned int len)
{ring_buff_lock(buff);len = ring_buff_out_peek(buff, buf, len);buff->out += len;ring_buff_unlock(buff);return len;
}

相关文章:

【ringbuff share mem】

ringbuff 和share mem 结合实现PV操作 参考链接 https://juejin.cn/post/7113550346835722276 https://zhuanlan.zhihu.com/p/147826545 代码如下&#xff1a; #include "rb.h"int g_shmid 0;shm_buff * create_shm(int *smid) {int id;shm_buff *share_mem NU…...

【Zookeeper专题】Zookeeper经典应用场景实战(一)

目录 前置知识课程内容一、Zookeeper Java客户端实战1.1 Zookeeper 原生Java客户端使用1.2 Curator开源客户端使用快速开始使用示例 二、Zookeeper在分布式命名服务中的实战2.1 分布式API目录2.2 分布式节点的命名2.3 分布式的ID生成器 三、zookeeper实现分布式队列3.1 设计思路…...

【数据库——MySQL】(15)存储过程、存储函数和事务处理习题及讲解

目录 1. 题目1.1 存储过程1.2 存储函数1.3 事务处理 2. 解答2.1 存储过程2.2 存储函数2.3 事务处理 1. 题目 1.1 存储过程 创建表 RandNumber &#xff1a;字段&#xff1a;id 自增长&#xff0c; data int&#xff1b; 创建存储过程向表中插入指定个数的随机数&#xff08;1-…...

FFmpeg:打印音/视频信息(Meta信息)

多媒体文件基本概念 多媒体文件其实是个容器在容器里面有很多流(Stream/Track)每种流是由不同的编码器编码的从流中读出的数据称为包在一个包中包含着一个或多个帧 几个重要的结构体 AVFormatContextAVStreamAVPacket FFmpeg操作流数据的基本步骤 打印音/视频信息(Meta信息…...

1.Linux入门基本指令

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 01.ls指令 02.pwd指令 03.cd指令 04.touch指令 05.mkdir指令(重要) 06.rmdir&&rm指令(重要) 07.man指令(重要) 08.cp指令(重要) 09.mv指令(重要) 10.cat指令 nano指令 echo指令 输出重定向 追加重…...

2023腾讯云服务器优惠代金券领取、查询及使用说明

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…...

大华智慧园区管理平台任意密码读取漏洞 复现

文章目录 大华智慧园区管理平台任意密码读取漏洞 复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 大华智慧园区管理平台任意密码读取漏洞 复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&…...

【C++ 学习 ㉖】- 位图详解(哈希扩展)

目录 一、位图的概念 二、位图的实现 2.1 - bitset.h 2.2 - test.cpp 三、位图的应用 3.1 - 例题一 3.2 - 例题二 一、位图的概念 假设有这样一个需求&#xff1a;在 100 亿个整型数字中快速查询某个数是否存在其中&#xff0c;并假设是 32 位操作系统&#xff0c;4 GB…...

天启科技联创郭志强:趟遍教育行业信数化沟坎,创业智能赛道重塑行业生态

郭志强 天启科技联合创始人 近20年互联网、企业信息化、数字化实施、管理及培训经验。对于集团型企业及初创企业、传统企业及互联网企业的信息化、数字化转型有自己独到的见解和实操经验。具备跨区域、集团化信息规划、解决方案、系统架构及企业流程搭建、优化和技术团队管理能…...

Cuckoo沙箱各Ubuntu版本安装及使用

1.沙箱简介 1.1 沙箱 沙箱是一个虚拟系统程序&#xff0c;允许你在沙箱环境中运行浏览器或其他程序&#xff0c;因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境&#xff0c;在其内部运行的程序并不能对硬盘产生永久性的影响。 在网络安全中&#xff…...

什么是mvvm模式,优点是什么

MVVM&#xff08;Model-View-ViewModel&#xff09;模式是一种设计模式。它是一种开发模式&#xff0c;旨在分离用户界面的开发和业务逻辑的开发。MVVM模式将应用程序分为三个部分&#xff1a; Model&#xff1a;它代表应用程序的数据模型和业务逻辑。 View&#xff1a;它代表…...

C/C++ 中的函数返回局部变量以及局部变量的地址?

C/C中&#xff0c;函数内部的一切变量(函数内部局部变量&#xff0c;形参)都是在其被调用时才被分配内存单元。形参和函数内部的局部变量的生命期和作用域都是在函数内部(static变量的生命期除外)。子函数运行结束时&#xff0c;所有局部变量的内存单元会被系统释放。在C中&…...

springboot和vue:七、mybatis/mybatisplus多表查询+分页查询

mybatisplus实际上只对单表查询做了增强&#xff08;速度会更快&#xff09;&#xff0c;从传统的手写sql语句&#xff0c;自己做映射&#xff0c;变为封装好的QueryWrapper。 本篇文章的内容是有两张表&#xff0c;分别是用户表和订单表&#xff0c;在不直接在数据库做表连接的…...

【Leetcode】 51. N 皇后

按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种…...

Java数据库连接:JDBC介绍与简单示例

Java数据库连接&#xff1a;JDBC介绍与简单示例 在Java程序中&#xff0c;操作数据库是必不可少的。JDBC&#xff08;Java Database Connectivity&#xff09;是Java中用于连接和操作数据库的一种技术。通过JDBC&#xff0c;Java程序可以与各种关系型数据库进行交互&#xff0…...

智慧茶园:茶厂茶园监管可视化视频管理系统解决方案

一、方案背景 我国是茶叶生产大国&#xff0c;茶叶销量全世界第一。随着经济社会的发展和人民生活水平的提高&#xff0c;对健康、天然的茶叶产品的消费需求量也在逐步提高。茶叶的种植、生产和制作过程工序复杂&#xff0c;伴随着人力成本的上升&#xff0c;传统茶厂的运营及…...

springboot整合pi支付开发

pi支付流程图&#xff1a; 使用Pi SDK功能发起支付由 Pi SDK 自动调用的回调函数&#xff08;让您的应用服务器知道它需要发出批准 API 请求&#xff09;从您的应用程序服务器到 Pi 服务器的 API 请求以批准付款&#xff08;让 Pi 服务器知道您知道此付款&#xff09;Pi浏览器向…...

类 ChatGPT 模型存在的局限性

尽管类ChatGPT模型经过数月的迭代和完善&#xff0c;已经初步融入了部分领域以及人们的日常生活&#xff0c;但目前市面上的产品和相关技术仍然存在一些问题&#xff0c;以下列出一些局限性进行详细说明与成因分析&#xff1a; 1&#xff09;互联网上高质量、大规模、经过清洗…...

Nginx的安全控制

安全控制 关于web服务器的安全是比较大的一个话题&#xff0c;里面所涉及的内容很多&#xff0c;Nginx反向代理是安全隔离来提升web服务器的安全&#xff0c;通过代理分开了客户端到应用程序服务器端的连接&#xff0c;实现了安全措施。在反向代理之前设置防火墙&#xff0c;…...

字符串与字符编码 - GO语言从入门到实战

字符串与字符编码 - GO语言从入门到实战 字符串 与其他主要编程语⾔的差异 基本数据类型&#xff1a;string 是基础数据类型&#xff0c;而不是引用类型或指针类型。string 在内存中占用的空间大小是固定的&#xff0c;且只读、不可改变。字节切片&#xff1a;string 是只读…...

12P4375X042-233C KJ2005X1-BA1 CE3007 EMERSON servo controller

12P4375X042-233C KJ2005X1-BA1 CE3007 EMERSON servo controller 我们提供三种不同类别的EDGEBoost I/O模块供选择&#xff0c;以实现最大程度的I/O定制: 数字和模拟输入/输出网络和连接边缘人工智能和存储 利用EDGEBoost I/O实现变革性技术 EBIO-2M2BK EBIO-2M2BK载板支持…...

WPF向Avalonia迁移(四、其他事项)

开发必备 1. Avalonia项目源代码&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;没有源代码&#xff0c;你连控件的背景色怎么改都找不着&#xff01;&#xff01; 2.下载你所使用的版本&#x…...

Python 代码调试

from pdb import set_trace as stx 是一个Python代码中常用的调试技巧之一&#xff0c;它用于在代码中插入断点以进行调试。这行代码的作用是将Python标准库中的 pdb&#xff08;Python Debugger&#xff09;模块中的 set_trace 函数导入&#xff0c;并将其重命名为 stx&#x…...

DM宣传单制作,利用在线模板,快速替换文字

如果你需要制作一批宣传单&#xff0c;但是时间很紧&#xff0c;而且没有专业的设计人员协助&#xff0c;那么你可以选择使用在线模板来快速制作宣传单。本文将介绍如何使用乔拓云平台&#xff0c;快速制作宣传单的方法。 步骤一&#xff1a;选择适合的在线制作工具 首先&…...

【力扣】42. 接雨水

这道题我卡了差不多1个小时&#xff0c;不是不会做&#xff0c;是不知道怎么能用栈来实现&#xff0c;后面看了一个博主的视频&#xff0c;豁然开朗&#xff0c;我主要的纠结点在于当指针指到7的时候&#xff0c;我计算出4到7的水块是2&#xff0c;但实际上是0&#xff0c;因为…...

IPETRONIK数据采集设备携手Softing Q-Vision软件致力于ADAS测试方案

一 背景 汽车ADAS技术是当下国内外的重点研究方向&#xff0c;且ADAS的发展水平和市场竞争力紧密相关&#xff0c;因此一套完善的ADAS测试方案对各整车厂而言非常重要。然而&#xff0c;国内ADAS测试却面临着很多阻碍&#xff0c;主要原因在于&#xff1a;相关测试设备昂贵&am…...

Go语言中的指针介绍

Go语言中的指针 文章目录 Go语言中的指针一、Go语言中的指针介绍1.1 指针介绍1.2 基本语法1.3 声明和初始化1.4 Go 指针的3个重要概念1.4.1 指针地址&#xff08;Pointer Address&#xff09;1.4.2 指针类型&#xff08;Pointer Type&#xff09;1.4.3 指针取值&#xff08;Poi…...

简单理解区块链

这篇是挖矿篇详细介绍区块链之挖矿-CSDN博客的后置文章&#xff0c;咱们通过之前的解释进一步复习学习区块链叭&#xff01; 百度百科定义 区块链&#xff0c;就是一个又一个区块组成的链条。每一个区块中保存了一定的信息&#xff0c;它们按照各自产生的时间顺序连接成链条。这…...

[尚硅谷React笔记]——第3章 React应用(基于React脚手架)

目录&#xff1a; react脚手架创建项目并启动react脚手架项目结构一个简单的Hello组件样式的模块化功能界面的组件化编码流程&#xff08;通用&#xff09;组件的组合使用-TodoList 1.react脚手架 xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需…...

《Linux 内核设计与实现》13. 虚拟文件系统

通用文件接口 VFS 使得可以直接使用 open()、read()、write() 这样的系统调用而无需考虑具体文件系统和实际物理介质。 好处&#xff1a;新的文件系统和新类型的存储介质需要挂载时&#xff0c;程序无需重写&#xff0c;甚至无需重新编译。 VFS 将各种不同的文件系统抽象后采…...

网站ie浏览器不兼容/深圳seo顾问

今天无意中发现一个好玩的照片&#xff0c;可能有人玩過了 -v- 但真的蛮有意思的——————–先看看這張圖然後如果你有戴眼鏡拿掉再看一次如果你看到了二張不同的圖恭喜你 你真的近視了(這句話是對還沒戴眼鏡而近視的人說的)&#xff08;一般人應該會先看到 愛因斯坦 近視或…...

德州住房和城乡建设局网站/武汉百度推广电话

据外媒报道指&#xff0c;三星已决定牺牲手机业务的利润&#xff0c;将重夺印度智能手机市场份额第一名作为首要目标&#xff0c;为此它在印度市场更加重视中低端市场&#xff0c;大量推出A系、J系手机&#xff0c;每月将推出一两款手机&#xff0c;针对印度线上手机市场推出的…...

本科学历提升/百度搜索优化怎么做

原文地址为&#xff1a; 利用python进行数据分析之数据聚合和分组运算对数据集进行分组并对各分组应用函数是数据分析中的重要环节。 group by技术 pandas对象中的数据会根据你所提供的一个或多个键被拆分为多组&#xff0c;拆分操作是在对象的特定轴上执行的&#xff0c;然后…...

最专业的网站建设价格/看广告收益最高的软件

矩阵分析之 实矩阵分解&#xff08;1&#xff09;特征分解与奇异值分解前言特征分解&#xff08;又称谱分解、对角化&#xff09;奇异值分解SVDSVD的进一步理解前言 本篇开始学习记录矩阵分解内容。需要说明的是&#xff0c;目前我所触及的矩阵基本上没有出现复数域&#xff0…...

佛山做网站哪家好/网站批量查询

L2-算法基础-第07课 递推1, 2, 4, 8, 16 …… 数列的下一项是什么&#xff1f; 1, 2, 3, 5, 8 …… 数列的下一项是什么&#xff1f;递推递推就是指从已知的初始条件出发&#xff0c;依据某种递推关系&#xff0c;逐次推出所要求的各中间结果及最后结果。可用递推算法求解的问题…...

做产地证网站/武汉java培训机构排名榜

5、链表适用于写操作多&#xff0c;读操作少的场景。 二、单链表 链表是有序的列表&#xff0c;但是它在内存中存储如下&#xff1a; 上图小结&#xff1a; 1、链表是以节点的方式来存储&#xff0c;是链式存储 2、每个节点包含data域&#xff0c;next域&#xff1a;指向下一…...