【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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/97731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SketchyCOCO数据集进行前景图像、背景图像和全景图像的分类

SketchyCOCO数据集进行前景图像、背景图像和全景图像的分类 import os import shutildef CopyFile(src, dst, filename):if not os.path.exists(dst):os.makedirs(dst)print(create dir: dst)try:shutil.copy(src\\filename, dst\\filename)except Exception as e:print(cop…

计算机网络-计算机网络体系结构-物理层

目录 一、通信基础 通信方式 传输方式 码元 传输率 *二 准则 2.1奈氏准则(奈奎斯特定理) 2.2香农定理 三、信号的编码和调制 *数字数据->数字信号 数字数据->模拟信号 模拟数据->数字信号 模拟数据->模拟信号 *四、数据交换方式 电路交换 报文交换…

算法练习(11):牛客在线编程07 动态规划

package jz.bm;import javax.crypto.MacSpi; import java.util.ArrayList; import java.util.Arrays;public class bm7 {/*** BM62 斐波那契数列*/public int Fibonacci(int n) {if (n < 2) {return 1;}int[] dp new int[n 1];dp[1] 1;dp[2] 1;for (int i 3; i < n;…

kafka客户端应用参数详解

一、基本客户端收发消息 Kafka提供了非常简单的客户端API。只需要引入一个Maven依赖即可&#xff1a; <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka_2.13</artifactId><version>3.4.0</version></depend…

将python项目部署在一台服务器上

将python项目部署在一台服务器上 1.服务器2.部署方法2.1 手动部署2.2 容器化技术部署2.3 服务器less技术部署 1.服务器 服务器一般为&#xff1a;物理服务器和云服务器。 我的是物理服务器&#xff1a;这是将服务器硬件直接放置在您自己的数据中心或机房的传统方法。这种方法需…

力扣 -- 516. 最长回文子序列

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int longestPalindromeSubseq(string s) {int ns.size();vector<vector<int>> dp(n,vector<int>(n));//记得从下往上填表for(int in-1;i>0;i--){//记得i是小于等于j的for(int ji;j&l…

山体滑坡监测系统——高效、便捷的新选择

在当今社会&#xff0c;科技的进步为我们的生活和工作带来了诸多便利。而在山体滑坡监测领域&#xff0c;全球导航卫星系统&#xff08;GNSS&#xff09;的引入更是增加了数据监测的高效性和便捷性。 一、山体滑坡监测系统的基本原理 山体滑坡监测系统是由监控平台和GNSS位移…

2.6 宽带接入技术

思维导图&#xff1a; 前言&#xff1a; 我的理解&#xff1a; 1. **早期互联网接入技术的局限性**&#xff1a; - 作者首先回顾了早期用户通过电话线和调制解调器连接到互联网服务提供商&#xff08;ISP&#xff09;的方式&#xff0c;指出这种方式的速度上限是56 kbit/…

my_print_defaults 及perror

参考文档&#xff1a; https://mysql.net.cn/doc/refman/8.0/en/my-print-defaults.html https://mysql.net.cn/doc/refman/8.0/en/perror.html -- my.cnf的内容 [rootredhat762100 mysql3306]# more my.cnf [mysqld] datadir/mysql/mysql3306/data #socket/tmp/mysql3306.so…

UE5.1编辑器拓展【三、脚本化资产行为,删除无引用资产】

目录 需要考虑的问题 重定向的修复函数 代码&#xff1a; 删除无引用资产 代码 需要添加的头文件和模块 在我们删除资产的时候&#xff0c;会发现&#xff0c;有些资产在删除的时候会出现有被什么什么引用&#xff0c;还有的是没有被引用。 而我们如果直接选择一片去进行…

FFmpeg横竖版视频互换背景模糊一键生成

视频处理是现代多媒体应用中常见的需求。其中横竖版视频互换和背景模糊是视频编辑中常见的操作。FFmpeg是一个功能强大的工具,适用于这些任务。 本文将详细介绍如何使用FFmpeg进行横竖版视频互换和背景模糊。 文章目录 操作命令与命令说明横版转竖版竖版转横版背景模糊处理横…

PHP 伪协议:使用 php://input 访问原始 POST 数据

文章目录 参考环境PHP 伪协议概念为什么需要 PHP 伪协议&#xff1f; php://input为什么需要 php://input&#xff1f;更灵活的数据处理减小性能压力 发送 POST 数据HackBarHackBar 插件的获取 $_POST打开 HackBar 插件通过 HackBar 插件发起 POST 请求 基操 enable_post_data_…

ROS机械臂开发-开发环境搭建【一】

目录 前言环境配置docker搭建Ubuntu环境安装ROS 基础ROS文件系统 bugs 前言 想系统学习ROS&#xff0c;做一些机器人开发。因为有些基础了&#xff0c;这里随便写写记录一下。 环境配置 docker搭建Ubuntu环境 Dockerfile # 基础镜像 FROM ubuntu:18.04 # 设置变量 ENV ETC…

Split index API

Split index API | Elasticsearch Guide [8.10] | Elastic 当您使用Elasticsearch集群出现索引分片设置不合理&#xff08;例如索引主分片设置不合理、每个分片存在大量数据等&#xff09;引发集群性能问题时&#xff0c;可通过_split API在线扩大主分片数&#xff0c;将现有索…

[开源]基于Vue的拖拽式数据报表设计器,为简化开发提高效率而生

一、开源项目简介 Cola-Designer 是一个 基于VUE&#xff0c;实现拖拽 配置方式生成数据大屏&#xff0c;为简化开发、提高效率而生。 二、开源协议 使用GPL-2.0开源协议 三、界面展示 概览 部分截图&#xff1a; 四、功能概述 特性 0 代码 实现完全拖拽 配置式生成…

SpringBoot中常用注解的含义

一、方法参数注解 1. PathVariable 通过RequestMapping注解中的 { } 占位符来标识URL中的变量部分 在控制器中的处理方法的形参中使用PathVariable注解去获取RequestMapping中 { } 中传进来的值&#xff0c;并绑定到处理方法定一的形参上。 //请求路径&#xff1a;http://3333…

【好玩】如何在github主页放一条贪吃蛇

前言 &#x1f34a;缘由 github放小蛇&#xff0c;就问你烧不烧 起因看到大佬github上有一条贪吃蛇扭来扭去&#xff0c;觉得好玩&#xff0c;遂给大家分享一下本狗的玩蛇历程 &#x1f95d;成果初展 贪吃蛇 &#x1f3af;主要目标 实现3大重点 1. github设置主页 2. git…

C#学习系列相关之多线程(二)----Thread类介绍

一、线程初始化 1.无参数 static void Main(string[] args) {//第一种写法Thread thread new Thread(test);thread.Start();//第二种写法 delegateThread thread1 new Thread(new ThreadStart(test));thread1.Start();//第三种写法 lambdaThread thread2 new Thread(() >…

从零开始的C++(补充三的内容)

auto:在编译阶段根据数据的类型确认auto所代表的类型&#xff0c;并将auto换成对应的类型。 特点&#xff1a; 1、auto所能代表的类型必须是在编译阶段就能确认的。 2、auto修饰的变量必须初始化&#xff0c;否则编译器无法判断auto的实际类型。 3、auto会根据第一个数据来…

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务

项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管理的提升提出了更高的要求。 二、企业通过数字化转型&#xff0c;不仅有利于优化业务流程、提升经营管理…