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
{
	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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


#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,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

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

你可能感兴趣的:(c++)