Linux c++ shm 共享内存 传输图像

2024-01-27 13:48

本文主要是介绍Linux c++ shm 共享内存 传输图像,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前写了个项目的demo,windows平台下python实现的,由于效率问题,用了多进程,进程间的通讯是依赖于multiprocessing manager.

前段时间,突然说要把项目移植到Liunx平台下,而且要用c++来实现。(我直接晕过去了,这和重写一遍有什么区别?

遇到的第一个问题就是怎么解决进程间通信,百度之后决定使用共享内存。因为大家都说它的效率最快。

我用的是shm,关于它的介绍有很多,我这里就不解释了。

server.cpp ,往内存里写,int flag起到一个读写保护的作用,可以用锁来代替。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <vector>
#include <string>#define IMAGE_SIZE 480*640*3 //图片大小
using namespace std;typedef struct _BOX
{int  flag;char ch[IMAGE_SIZE];//之前用了cv::Mat不行,因为无法在结构体里初始化大小
}Box;int main()
{int shmid = shmget((key_t)1275, sizeof(Box), 0666|IPC_CREAT);void *shm = shmat(shmid, (void*)0, 0);Box *pBox = (Box*)shm;pBox->flag = 0;int i = 0;while(1){while(pBox->flag == 0){getchar();cv::Mat Img=cv::imread("/home/qogori/shared_memory/src/dst.bmp",cv::IMREAD_COLOR);int size = Img.cols * Img.rows * Img.channels();if(Img.data== nullptr)//nullptr是c++11新出现的空指针常量{printf("图片文件不存在\n");return 0;}printf("Memory attached at %p\n", (int *)(shm));char *from = (char*)Img.data;memcpy(pBox->ch, from, size);pBox->flag = 1;}}shmdt(shm);return 0;
}

client.cpp ,从内存读数据

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>#define IMAGE_SIZE 640*480*3 //图片大小
using namespace std;typedef struct _BOX
{int  flag;char ch[IMAGE_SIZE];
}Box;int main()
{int shmid = shmget((key_t)1275, sizeof(Box), 0666|IPC_CREAT);void *shm = shmat(shmid, (void*)0, 0);Box *pBox = (Box*)shm;size_t sizeofbuf;while(1){if(pBox->flag == 1){cv::Mat cvoutImg = cv::Mat(480,640,CV_8UC3,cv::Scalar(255, 255, 255));//bufHight,bufWidthint size = cvoutImg.cols * cvoutImg.rows * cvoutImg.channels();memcpy((char*)cvoutImg.data, pBox->ch,size);cv::imshow("xx",cvoutImg);cv::waitKey(1000);pBox->flag = 0;}       }shmdt(shm);shmctl(shmid, IPC_RMID, 0);return 0;
} 

参考:

https://blog.csdn.net/stpeace/article/details/74834150

https://blog.csdn.net/qq_43762191/article/details/104995194

这篇关于Linux c++ shm 共享内存 传输图像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/650424

相关文章

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque