之前写了个项目的demo,windows平台下python实现的,由于效率问题,用了多进程,进程间的通讯是依赖于multiprocessing manager.
前段时间,突然说要把项目移植到Liunx平台下,而且要用c++来实现。(我直接晕过去了,这和重写一遍有什么区别?
遇到的第一个问题就是怎么解决进程间通信,百度之后决定使用共享内存。因为大家都说它的效率最快。
我用的是shm,关于它的介绍有很多,我这里就不解释了。
server.cpp ,往内存里写,int flag起到一个读写保护的作用,可以用锁来代替。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include #define IMAGE_SIZE 480*640*3 //图片大小
using namespace std;
typedef struct _BOX
{
intflag;
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=https://www.it610.com/article/= 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
#include
#include
#include
#include
#include
#include
#include #define IMAGE_SIZE 640*480*3 //图片大小
using namespace std;
typedef struct _BOX
{
intflag;
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,bufWidth
int 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
【Linux c++ shm 共享内存 传输图像】https://blog.csdn.net/qq_43762191/article/details/104995194
推荐阅读
- 个人日记|K8s中Pod生命周期和重启策略
- 学习分享|【C语言函数基础】
- C++|C++浇水装置问题
- 数据结构|C++技巧(用class类实现链表)
- C++|从零开始学C++之基本知识
- 步履拾级杂记|VS2019的各种使用问题及解决方法
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- 动态规划|暴力递归经典问题
- 麦克算法|4指针与队列
- 遇见蓝桥遇见你|小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题