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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值