在linux 下使用Qt 的QSharedMemory, 碰到了不能创建共享内存的问题。
sharemem.create 返回false.
经仔细研究,发现在linux 下, sharemem create 失败并不代表错误,
它可能已经被创建了,所以不能再创建同名共享内存了。
linux 共享内存,创建者进程退出时并不会释放共享内存,所以上述问题极易发生。
而windows 在创建者进程退出时,会释放共享内存,这是它们的区别。
想一想,似乎都有道理。windows 粗暴一些,但用法简单。
linux 考虑周到一些,共享内存可以脱离创建者进程独立存在,但用法就复杂一些。
linux 下, 有程序ipcs, ipcrm 来管理,观察共享内存。
把玩如下简单代码: 配合ipcs -m, ipcs -m -p, ipcrm -m 即可理解共享内存了。
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();
}