当前位置: 首页 > article >正文

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

运行截图:

写:

读:


http://www.kler.cn/a/599493.html

相关文章:

  • HarmonyOS NEXT 基于原生能力获取视频缩略图
  • 2025年3月24日(matlab/simulink 问题集)
  • JAVA线程安全的集合类分类
  • 【Kafka】Kafka可靠的数据传递
  • 数据结构-栈的应用(括号匹配,表达式求值(中缀转后缀、中缀表达式))
  • CollageDao
  • 图相关知识总结
  • Spring Boot与K8s深度融合
  • 利用dify打造命令行助手
  • Hugging Face预训练GPT微调ChatGPT(微调入门!新手友好!)
  • Spring MVC 异步接口简析
  • Apache Dubbo 与 ZooKeeper 集成:服务注册与发现的全解析
  • 版本控制GIT的使用
  • 基础算法篇(2)(蓝桥杯常考点)
  • GitHub供应链攻击事件:Coinbase遭袭,218个仓库暴露,CI/CD密钥泄露
  • PostgreSQL结构
  • v-chart 显示BUG (图表显示不全)
  • 【Android】VehiclePropertyAccess引起CarService崩溃
  • 网络故障排查
  • spring和maven