Linux共享内存
写数据进程:
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 _WIN32
int key;
#else
key_t key;
#endif
int 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
#else
key = ftok(SHAREMEMORYTEST,65); // 创建唯一的键SHAREMEMORYTEST
if (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;
}
#endif
return 0;
}
ShareMemory* ShareMemory::getInstance(int size)
{
if (instance==nullptr)
{
instance=new ShareMemory(size);
}
return instance;
}
int ShareMemory::closeShareMemory()
{
#ifdef _WIN32
#else
//分离共享内存
#ifdef _WIN32
#else
if (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;
}
#endif
return 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 _WIN32
Sleep(1000*10);
#else
sleep(10);
#endif
share->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 _WIN32
int key;
#else
key_t key;
#endif
int 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
#else
key = ftok(SHAREMEMORYTEST,65); // 创建唯一的键SHAREMEMORYTEST
if (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;
}
#endif
return 0;
}
ShareMemory* ShareMemory::getInstance(int size)
{
if (instance==nullptr)
{
instance=new ShareMemory(size);
}
return instance;
}
int ShareMemory::closeShareMemory()
{
#ifdef _WIN32
#else
//分离共享内存
#ifdef _WIN32
#else
if (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;
}
#endif
return 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
运行截图:
写:
读: