qt QSharedMemory 用法

原创 2015年11月20日 13:23:03
在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();
}                                                                                                                    


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

QT 进程间通信之古老的方法(内存共享)

Qt提供了一种安全的共享内存的实现QSharedMemory,以便在多线程和多进程编程中安全的使用。比如说QQ的聊天的客户端,这里有个个性头象,当点击QQ音乐播放器的时候,启动QQ音乐播放器(启动一Q...

Qt之进程间通信(共享内存)

简述上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信。但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢?下面我们来分享另外一种跨平...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Qt应用程序单实例化

在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序。Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直...

QShareMemory 学习

转自:http://hi.baidu.com/cyclone/blog/item/3ebca9ec06b81a2863d09f7a.html 目的:配合windows核心编程第17章(内...

网络互联杂项

1. 启动或查询tftp 服务需要 提权。 hjj@hjj-Inspiron:/opt$ service tftpd-hpa status status: Unknown job: tftpd-hpa...

QDataStream 用法

// QDataStream是数据流,相当于数据管道,屏蔽了数据转换过程。 // 可以连接到一个设备上,这个设备可以是socket, file,或buffer // 数据的表达方式,实际上是大端序,即...

QSharedMemory 共享内存 进程间通信

QT间进程通信之共享内存   Qt提供了一种安全的共享内存的实现QSharedMemory,以便在多线程和多进程编程中安全的使用。比如说QQ的聊天的客户端,这里有个个性头象,当点击QQ音乐播放器的时候...

追踪内核Makefile 的一点心得。

算学习内涵的一个小阶梯。留念于此。 追踪内核Makefile,解释3个小问题: 这里先来解释第一个问题: -----------------------------------------------...

真假const 指针

/* 把 #if 0 改为#if 1, 可以看到什么是真正的不可写指针 */ #include int main() { #if 0     const char *p="hello";  // 这...

gcc 编译器 , __builtin_expect() 研究

在linux 代码中看到的 LIKELY(x), UNLIKELY(x), 其实是__builtin_expect() 测试__builtin_expect() 函数,到底是何意思?  c...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)