qt QSharedMemory 用法

在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();
}                                                                                                                    


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hejinjing_tom_com/article/details/49946145
个人分类: qt 编程
上一篇本机win7, 虚拟机ubuntu文件共享debug
下一篇QDataStream 用法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭