头文件
#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;
}
}
}