写数据进程:
shareMemory.h
#ifndef _SHAREMEMORY_H_
#define _SHAREMEMORY_H_
#include <iostream>
#include <cstring>
#include <cerrno>
#include <cstdint>
#ifdef _WIN32#else
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#endif#define SHAREMEMORYTEST "/home/xyt/work/work/test/3/share_name_test"class ShareMemory
{
public:~ShareMemory();int init();static ShareMemory* getInstance(int size);//释放资源int closeShareMemory();int writeDatdToShareMemory(uint8_t *buf,int bufSize);uint8_t* getShareMemoryData();
private:static ShareMemory* instance;ShareMemory(int size);int shareMemorySize;#ifdef _WIN32int key;#elsekey_t key;#endifint shmid;uint8_t *shareAddress;
};#endif //_SHAREMEMORY_H_
shareMemory.cpp
#include "shareMemory.h"
ShareMemory::ShareMemory(int size)
{//共享内存大小shareMemorySize=size;//key=-1;//shmid=-1;//共享内存地址shareAddress=nullptr;
}ShareMemory::~ShareMemory()
{if (instance!=nullptr){delete instance;}
}
//静态成员初始化ShareMemory* ShareMemory::instance=nullptr;#ifdef _WIN32
int ShareMemory::init()
{return 0;
}
#else#endif
int ShareMemory::init()
{#ifdef _WIN32#elsekey = ftok(SHAREMEMORYTEST,65); // 创建唯一的键SHAREMEMORYTESTif (key==-1){std::cout<<"ftok error"<<std::endl;return -1;}shmid = shmget(key, shareMemorySize, 0666|IPC_CREAT); // 创建共享内存if (shmid==-1){std::cout<<"shmget error"<<std::endl;return -1;}shareAddress = (uint8_t*) shmat(shmid, nullptr, 0); // 映射共享内存if (shareAddress==(uint8_t*)(-1)){std::cout<<"shmat error"<<std::endl;return -1;}#endifreturn 0;
}
ShareMemory* ShareMemory::getInstance(int size)
{if (instance==nullptr){instance=new ShareMemory(size);}return instance;
}
int ShareMemory::closeShareMemory()
{#ifdef _WIN32#else//分离共享内存#ifdef _WIN32#elseif (shmdt(shareAddress) == -1) {std::cout<<"shmdt error"<<std::endl;}else{std::cout<<"shmdt success"<<std::endl;}#endif//删除共享内存if (shmctl(shmid, IPC_RMID, NULL) == -1) {std::cout<<"The share memory has been released."<<std::endl;}#endifreturn 0;
}
int ShareMemory::writeDatdToShareMemory(uint8_t *buf,int bufSize)
{if (bufSize>shareMemorySize){std::cout<<"your buf is too large,and the data writting failed"<<std::endl;return -1;}if (shareAddress==nullptr){std::cout<<"shareAddress is nullptr"<<std::endl;return -1;}memcpy(shareAddress,buf,bufSize);return 0;
}
uint8_t* ShareMemory::getShareMemoryData()
{if (shareAddress==nullptr){std::cout<<"There is no such shared memory"<<std::endl;return nullptr;}return shareAddress;
}
main.cpp
#include <iostream>
#include"shareMemory.h"
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif
using namespace std;
int main()
{ShareMemory *share=ShareMemory::getInstance(1024); int res=share->init(); uint32_t value=120; uint8_t buf[4]; memcpy(buf,&value,sizeof(uint8_t)*4); share->writeDatdToShareMemory(buf,4); #ifdef _WIN32Sleep(1000*10);#elsesleep(10);#endifshare->closeShareMemory();return 0;
}
读数据进程:
shareMemory.h
#ifndef _SHAREMEMORY_H_
#define _SHAREMEMORY_H_
#include <iostream>
#include <cstring>
#include <cerrno>
#include <cstdint>
#ifdef _WIN32#else
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#endif#define SHAREMEMORYTEST "/home/xyt/work/work/test/3/share_name_test"class ShareMemory
{
public:~ShareMemory();int init();static ShareMemory* getInstance(int size);//释放资源int closeShareMemory();int writeDatdToShareMemory(uint8_t *buf,int bufSize);uint8_t* getShareMemoryData();
private:static ShareMemory* instance;ShareMemory(int size);int shareMemorySize;#ifdef _WIN32int key;#elsekey_t key;#endifint shmid;uint8_t *shareAddress;
};#endif //_SHAREMEMORY_H_
shareMemory.cpp
#include "shareMemory.h"
ShareMemory::ShareMemory(int size)
{//共享内存大小shareMemorySize=size;//key=-1;//shmid=-1;//共享内存地址shareAddress=nullptr;
}ShareMemory::~ShareMemory()
{if (instance!=nullptr){delete instance;}
}
//静态成员初始化ShareMemory* ShareMemory::instance=nullptr;#ifdef _WIN32
int ShareMemory::init()
{return 0;
}
#else#endif
int ShareMemory::init()
{#ifdef _WIN32#elsekey = ftok(SHAREMEMORYTEST,65); // 创建唯一的键SHAREMEMORYTESTif (key==-1){std::cout<<"ftok error"<<std::endl;return -1;}shmid = shmget(key, shareMemorySize, 0666|IPC_CREAT); // 创建共享内存if (shmid==-1){std::cout<<"shmget error"<<std::endl;return -1;}shareAddress = (uint8_t*) shmat(shmid, nullptr, 0); // 映射共享内存if (shareAddress==(uint8_t*)(-1)){std::cout<<"shmat error"<<std::endl;return -1;}#endifreturn 0;
}
ShareMemory* ShareMemory::getInstance(int size)
{if (instance==nullptr){instance=new ShareMemory(size);}return instance;
}
int ShareMemory::closeShareMemory()
{#ifdef _WIN32#else//分离共享内存#ifdef _WIN32#elseif (shmdt(shareAddress) == -1) {std::cout<<"shmdt error"<<std::endl;}else{std::cout<<"shmdt success"<<std::endl;}#endif//删除共享内存if (shmctl(shmid, IPC_RMID, NULL) == -1) {std::cout<<"The share memory has been released."<<std::endl;}#endifreturn 0;
}
int ShareMemory::writeDatdToShareMemory(uint8_t *buf,int bufSize)
{if (bufSize>shareMemorySize){std::cout<<"your buf is too large,and the data writting failed"<<std::endl;return -1;}if (shareAddress==nullptr){std::cout<<"shareAddress is nullptr"<<std::endl;return -1;}memcpy(shareAddress,buf,bufSize);return 0;
}
uint8_t* ShareMemory::getShareMemoryData()
{if (shareAddress==nullptr){std::cout<<"There is no such shared memory"<<std::endl;return nullptr;}return shareAddress;
}
main.cpp
#include <iostream>
#include"shareMemory.h"
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif
using namespace std;
int main()
{ShareMemory *share=ShareMemory::getInstance(1024); int res=share->init(); uint8_t* address=share->getShareMemoryData();uint32_t v;memcpy(&v,address,sizeof(uint8_t)*4);cout<<"read value: "<<v<<endl;share->closeShareMemory();return 0;
}
共享内存文件:
文件目录:/home/xyt/work/work/test/3
运行截图:
写:
读: