qt 创建共享内存举例

6 篇文章 0 订阅

头文件

#ifndef SHMREADER_H
#define SHMREADER_H


#define VRV_SHM_KEY 581
#include <sys/shm.h>
#include <stdio.h>
#include <QString>
#include <QJsonObject>


#define ERROR_OK                0
#define ERROR_OPEN_SHAREMEMORY  1
#define ERROR_KEY_NOTFOUND      2


#define IN
#define OUT


#define SHM_MAX_SIZE 1024


typedef struct _VRV_SHM
{
    char jsonval[SHM_MAX_SIZE];
}VRV_SHM, *PVRV_SHM;


class ShmReader
{
public:
    ShmReader();
    int Read(IN QString key, OUT QString & val);
    int Write(IN QString key, IN QString val);


private:
    int init();
    VRV_SHM * m_VrvShmPtr;
};


#endif // SHMREADER_H


实现文件

#include "shmreader.h"
#include <QDebug>
#include <stdlib.h>
#include <unistd.h>
#include <QJsonDocument>


ShmReader::ShmReader()
{
    init();
}


int ShmReader::Read(QString key, QString &val)
{
    if(m_VrvShmPtr==NULL)
    {
        qDebug("read error, open share memory failed.\n");
        return ERROR_OPEN_SHAREMEMORY;
    }


    QJsonParseError z_Err;
    QJsonObject z_Obj;
    QJsonDocument z_Doc = QJsonDocument::fromJson(m_VrvShmPtr->jsonval, &z_Err);
    if(z_Err.error == QJsonParseError::NoError)
    {
        //
        z_Obj = z_Doc.object();
        if(!z_Obj[key].isNull())
        {
            val = z_Obj[key].toString();
        }
        else
        {
            qDebug("read share memory error, key:%s not found !\n", key);
            return ERROR_KEY_NOTFOUND;
        }
    }
    else
    {
        qDebug("read share memory error, key:%s not found !\n", key);
        return ERROR_KEY_NOTFOUND;
    }


}




QString getString(const QJsonObject & obj)
{
    return QString(QJsonDocument(obj).toJson());
}


int ShmReader::Write(QString key, QString val)
{
    if(m_VrvShmPtr==NULL)
    {
        qDebug("write error, open share memory failed.\n");
        return ERROR_OPEN_SHAREMEMORY;
    }


    QJsonParseError z_Err;
    QJsonObject z_Obj;
    QJsonDocument z_Doc = QJsonDocument::fromJson(m_VrvShmPtr->jsonval, &z_Err);
    if(z_Err.error == QJsonParseError::NoError)
    {
        //
        z_Obj = z_Doc.object();
        z_Obj[key] = val;
        strcpy(m_VrvShmPtr->jsonval, getString(z_Obj).toStdString().c_str() );
    }
    else
    {
        //qDebug("read share memory error, key:%s not found !\n", key);
        z_Obj[key] = val;
        strcpy(m_VrvShmPtr->jsonval, getString(z_Obj).toStdString().c_str() );
        //return ERROR_KEY_NOTFOUND;
    }






}


int ShmReader::init()
{


    int z_smid = 0;
    void * z_shmaddr = 0;
    z_smid = shmget(VRV_SHM_KEY, SHM_MAX_SIZE, 0666|IPC_CREAT );
    if(-1==z_smid)
    {


        qDebug("err: shmget failed, errno()==%d \n", errno);
    }
    else
    {
        z_shmaddr = shmat(z_smid, 0, 0);
        if((void*)-1 == z_shmaddr)
        {
            qDebug("err: shmat failed..\n");
        }
        else
        {
            qDebug("memory addr xxx is %X \n", z_shmaddr);
            m_VrvShmPtr = (VRV_SHM *)z_shmaddr;
        }
    }
}




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值