欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > Linux共享内存

Linux共享内存

2025/8/11 12:50:56 来源:https://blog.csdn.net/qq_62687476/article/details/146486594  浏览:    关键词: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 _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

运行截图:

写:

读:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词