您的位置:首页 > 编程语言 > Qt开发

qt QSharedMemory 用法

2015-11-20 13:23 190 查看
在linux 下使用Qt 的QSharedMemory, 碰到了不能创建共享内存的问题。

sharemem.create 返回false.

经仔细研究,发现在linux 下, sharemem create 失败并不代表错误,

它可能已经被创建了,所以不能再创建同名共享内存了。

linux 共享内存,创建者进程退出时并不会释放共享内存,所以上述问题及易发生。

而windows 在创建者进程退出时,会释放共享内存,这是它们的区别。

想一想,似乎都有道理。windows 粗暴一切,但用法简单。

linux 考虑周到一些,共享内存可以脱离创建者进程独立存在,但用法就复杂一些。

linux 下, 有程序ipcs, ipcrm 来管理,观察共享内存。

把玩如下简单代码: 配合ipcs -m, ipcs -m -p, ipcrm -m 即可理解共享内存了。

#include <QApplication>
#include <QSharedMemory>
#include <stdio.h>

const char *source="only for test";
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSharedMemory sharedmem("hjjdebug");
if(sharedmem.attach())
{
if(!sharedmem.detach())
{
printf("can't detach from process\n");
}
}
if (sharedmem.create(1024)) {
qDebug("shared memory created.");
sharedmem.lock();
char * to = static_cast<char*>(sharedmem.data());
const char * from = source;
::memcpy(to, from, strlen(source));
sharedmem.unlock();
} else if (sharedmem.attach()) {
qDebug("shared memory attached.");
sharedmem.lock();
const char * data = static_cast<const char*>(sharedmem.constData());
printf("%s\n",data);
sharedmem.unlock();
}
else {
qDebug("error.");
}

return a.exec();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: