Qt进程间通信IPC
2014年8月29日
共享内存是由系统提供一个共享内存区域,供不同的进程共享。因此需要提供给系统一个识别码作为共享内存的名称,并指定需要的内存区域大小。
在需要读写内存是,需要连接到此区域(如果是第一次,则需要创建此区域)。然后可以读写此区域的内容。读写完成后要断开连接。操作系统负责此区域内存的分配和释放,维护一个连接列表,如果没有连接,则自动释放。
由于共享内存是由操作系统实际完成的,因此不同的操作系统实际上提供不同的方法。
Qt对不同的系统提供了统一封装,但是如果不在Qt应该程序中使用,则应该使用原始方式(读写应该使用相同的方式),这样才能在非Qt应用程序中使用(与非QT交互时,只能使用原始方式,因为QT会对Key进行改变)。
参考:http://www.devbean.net/2013/11/qt-study-road-2-ipc/
http://hi.baidu.com/mikenoodle/item/06b069869bec6ccdee083d71
Qt提供了QSharedMemory类对共享内存进行封装。
1) 创建:create()生成一个共享内存。需要指定大小和权限。
2) 加锁、解锁:在使用时要先加锁,使用完成后解锁。lock()/unlock().
3) 读取数据:data(),然后转换成自己需要的格式。
4) 写入数据:直接操作内存。memcpy()。
注意:使用delete/detach时,os会检测当前的引用情况,如果无引用则释放。所以创建完成后不能delete。而是根据情况调整策略,如果当前进程结束,则自动释放。
示例:
voidSmUtil::savetoSharedMemory(constchar*strSMName,constchar*strSMData,intiSize)
{
QStringstrName(strSMName);
QSharedMemory*pSharedMemory=newQSharedMemory(strName);
// pSharedMemory->setNativeKey(strName);
pSharedMemory->create(iSize,QSharedMemory::ReadWrite);
pSharedMemory->lock();
char*to=static_cast<char*>(pSharedMemory->data());
constchar*from=strSMData;
memcpy(to,from,qMin((int)strlen(from),pSharedMemory->size()));
pSharedMemory->unlock();
}
1) 创建共享内存对象
2) 调用attach进行连接
3) 使用时加锁、解锁
4) 直接转换内存
5) 解除连接
6) 释放内存对象
示例:
m_pSharedMemory=newQSharedMemory("REMOTE_CAL_SHARE_MEM_NAME",this);
// m_pSharedMemory->setNativeKey("REMOTE_CAL_SHARE_MEM_NAME");
if(!m_pSharedMemory->attach()){
qDebug()<<tr("AttachError:")<<m_pSharedMemory->errorString();
}
else
{
m_pSharedMemory->lock();
constchar*pStr=static_cast<constchar*>(m_pSharedMemory->constData());
qDebug("memory=%s.\n",pStr);
m_pSharedMemory->unlock();
m_pSharedMemory->detach();
}
http://www.devbean.net/2013/11/qt-study-road-2-ipc/