cmakelists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(test_share)
find_package(OpenCV 3 REQUIRED)
include_directories(
${CMAKE_CURRENT_LIST_DIR}
)
message(STATUS ${CMAKE_CURRENT_LIST_DIR})
file(GLOB_RECURSE mains ${CMAKE_CURRENT_SOURCE_DIR} *.cpp)
message(STATUS ${mains})
foreach(mainfile IN LISTS mains)
get_filename_component(mainname ${mainfile} NAME_WE)
add_executable(${mainname} ${mainfile})
target_link_libraries(${mainname} ${OpenCV_LIBS})
endforeach()
data_struct
#ifndef DATA_STRUCT_H
#include <sys/shm.h>
#define DATA_STRUCT_H
#define BUF_WIDTH 1280
#define BUF_HEIGHT 960
#define BUF_CHANNEL 3
#define BUF_IMAGE_SIZE BUF_WIDTH*BUF_HEIGHT*BUF_CHANNEL
#define SHM_KEY 2323
struct ShareData {
int flag;
int x,y,z;
char ch_data[BUF_IMAGE_SIZE];
};
int shmid = shmget((key_t)SHM_KEY, sizeof(ShareData), 0666|IPC_CREAT);
void *shm = shmat(shmid, (void*)0, 0);
ShareData *shareData = (ShareData*)shm;
#endif
writer
#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 "data_struct.h"
int main(void){
std::cout<<shareData->flag<<std::endl;
std::cout<<BUF_IMAGE_SIZE;
shareData->flag=0;
int i=0;
while(1)
{
i++;
while(shareData->flag == 0)
{
getchar();
cv::Mat Img=cv::imread("/home/wby/Pictures/saveImg/0000_rgb.jpg",cv::IMREAD_COLOR);
int size = Img.cols * Img.rows * Img.channels();
std::cout<<size;
if(Img.data== nullptr)
{
printf("图片文件不存在\n");
return 0;
}
printf("Memory attached at %p\n", (int *)(shm));
shareData->x=i;
shareData->flag = 1;
}
}
shmdt(shm);
return 0;
}
reader
#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 "data_struct.h"
int main(void)
{
while(1)
{
if(shareData->flag == 1)
{
std::cout<<shareData->x<<std::endl;
shareData->flag = 0;
}
usleep(100);
}
shmdt(shm);
shmctl(shmid, IPC_RMID, 0);
return 0;
}