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

之前写了个项目的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

    推荐阅读