QSharedMemory在linux下异常崩溃导致的bug

2023-11-20

感谢这位博主: https://blog.csdn.net/xinluo7/article/details/118226389

Windows系统下,当程序出现崩溃,虽然没有主动调用QSharedMemory.attach() ,但是系统会自动回收QSharedMemory共享内存内核对象。

Linux系统下,当程序崩溃后,因为没有执行QSharedMemory的析构函数,相当于是没有调用QSharedMemory.attach(),结果共享内核对象没有释放,linux也不会帮你回收。

为了让Qt程序能够同时只运行一个,通常我们只需要在main函数中添加如下代码:

QSharedMemory shared("XXXXX_QSharedMemory_Running");
if (shared.attach()) return 0;
shared.create(1);

这段代码,在Windows上出现程序崩溃后,能够再次启动程序,但是在Linux上,却是不可以的,原因上面已经解释了:就是Wndows会帮你自动回收内核对象,而Linux不会,这就导致在Linux中,这段共享内存一直存在,直到调用了attach。

针对上述现象,更改如下:

    QSharedMemory shared("DobotCalibrate_QSharedMemory_Running");
    if (!shared.create(1))
    {
        printf("the first time to create shared memory fail:%s\n",shared.errorString().toStdString().c_str());
        if (shared.error()==QSharedMemory::AlreadyExists)
        {
            shared.attach();
            shared.detach();
            if (!shared.create(1))
            {
                printf("the second time to create shared memory fail:%s\n",shared.errorString().toStdString().c_str());
                printf("app start fail,because the app is running!!!!!\n");
                return 0;
            }
        }
    }
    printf("app starting.......\n");

先create,失败了,然后根据错误码判断已经存在,然后attach一次,将当前进程附着在这个共享内存上,然后detach。最后再创建,如果还是失败,说明进程确实在运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QSharedMemory在linux下异常崩溃导致的bug 的相关文章

随机推荐

  • 静态类(static class)、成员类(member class)、局部类(local class)、匿名类   (anonymous class)

    内部类定义 在一个类的内部定义一个类 内部类分为 静态类 static class 成员类 member class 局部类 local class 匿名类 anonymous class static class 作为类的静态成员存在于某
  • DDD专家张逸:构建领域驱动设计知识体系

    张逸 读完需要 5分钟 速读仅需 2 分钟 领域驱动设计专家 曾就职于 ThoughtWorks 作为 Lead Consultant 为客户提供架构设计 大数据分析 持续交付 代码质量 敏捷管理等咨询服务 著译作包括 软件设计精要与模式
  • 线性模型和非线性模型的区别,以及激活函数的作用

    线性模型和非线性模型的区别 以及激活函数的作用 线性模型和非线性模型的区别 a 线性模型可以用曲线拟合样本 线性模型可以是用曲线拟合样本 但是分类的决策边界一定是直线的 例如logistics模型 广义线性模型 将线性函数进行了一次映射 b
  • 华为OD机试(JAVA)真题 -- 数据分类

    对一个数据a进行分类 分类方法为 此数据a 四个字节大小 的四个字节相加对一个给定的值b取模 如果得到的结果小于一个给定的值c 则数据a为有效类型 其类型为取模的值 如果得到的结果大于或者等于c 则数据a为无效类型 比如一个数据a 0x01
  • 从《数学之美》中我想到的

    吴军老师作为NLP领域的专家 在 数学之美 中把各种高大上的技术介绍得如此通俗易懂 抛去了冗杂的公式 呈现出最原始的数学思想 能够把复杂的问题用最简单易懂的语言表达出来 看来吴军老师的数学功底 工程实践水平非同一般 在 数学之美 里面 谈到
  • 立创EDA(专业版)画PCB怎么开窗?

    阻焊层是开窗 助焊层是开钢网用的 大概的步骤 1 选择图层 顶层阻焊层 如果是想在顶层开窗 2 画个矩形框框 3 右击点击属性 选择顶层阻焊 4 利用3D PCB 观察 如果选择区域和有类似焊盘上的没有覆膜的管脚的那个黄铜的部分 成功了
  • 跨域与跨域访问

    什么是跨域 跨域是指从一个域名的网页去请求另一个域名的资源 比如从www baidu com 页面去请求 www google com 的资源 跨域的严格一点的定义是 只要 协议 域名 端口有任何一个的不同 就被当作是跨域 为什么浏览器要限
  • 两种接入微信小程序智能客服对话的方式

    微信小程序 此处提供两种接入微信小程序的方式 方式一 扫码将机器人绑定至指定小程序 通过小程序内的客服组件开启智能对话功能 方式二 通过小程序插件接入 方式一 后台扫码绑定 流程示意 效果展示 使用页面 小程序页面中 点击 客服按钮 官方组
  • QT 打印/输出 的 3种方法

    1 cout输出 include
  • 【复变函数】常用公式大全

    文章目录 基本公式 几个高斯的公式 其实都是留数法 留数法 一些公式 一些积分 欢迎纠错 基本公式 f z u
  • 华为5500v3多路径linux6,CentOS7 DM-Multipath+HUAWEI OceanStor存储多路径配置

    在参看了网上他人的配置 结合RedHat的技术白皮书实现后 自己亲身在CentOS7 HUAWEI OceanStore S2600T的基础上配置了一个DM Multipath存储多路径的实现 其中碰到了一些小问题和不明白的地方 书上感觉也
  • 5. TypeScript 接口

    TypeScript 接口 接口可以在面向对象编程中表示行为的抽象 也可以描述对象的形状 接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约 接口中不能含有具体的实现逻辑 1 函数接口参数 没有接口的写法 const fullNa
  • three.js开发全景视频播放器的现实方法

    业余弄弄three js 想用three js实现播放全景视频 研究了一段 搜索很多资料 感觉这一遍很棒 搜藏分享下 原理 将video标签拉伸显示在three js场景的一个球模型上 用相机在中间播放渲染 基础 基于three js官方案
  • IntelliJ IDEA 学习笔记 - 几个窗口布局设置技巧

    原文 https blog csdn net cgl125167016 article details 79000774 utm source copy IntelliJ IDEA 简体中文专题教程 编辑区分屏 IntelliJ IDEA
  • 下载Eclipse IDE

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 下载eclipse 二 安装语言包 一 下载eclipse Eclipse是一个开放源代码的 基于Java的可扩展开发平台 官方网站是https www ecl
  • 为 SQL Server 站点数据库服务器配置 SPN

    如何为 SQL Server 站点数据库服务器配置 SPN 主题上次更新时间 2008 年 1 月 使用 SQL Server 计算机的本地系统帐户运行 SQL Server 服务不是 SQL Server 最佳方案 为了最安全地运行 SQ
  • day 2

    定义一个学生的结构体 包含学生的姓名年龄 成绩 性别 学生的成绩姓名定义为私有权限 定义一个学生类型的结构体变量 设置共有函数用于给学生的成绩和名字进行赋值 include
  • 半导体成新资本洼地,国产化浪潮势不可挡

    配图来自Canva 近日 中芯国际成功登陆科创板 按照中芯国际发行价27 46元 股 发行16 86亿股计算 本次的募资金额是462 87亿元 比此前招股书规划的200亿元高出一倍多 在超额配售选择权行使后 发行总股数扩大至19 38亿股
  • Linux查看与挂载新磁盘

    问题 把CentOS都换成了Ubuntu Server 16 04 LTS 用df h查看磁盘占用情况 确发现之前插入的一块大容量磁盘 dev sdb1消失了 是磁盘坏了 还是没被系统识别 解决 1 用命令fdisk l查看新磁盘是否被系统
  • QSharedMemory在linux下异常崩溃导致的bug

    感谢这位博主 https blog csdn net xinluo7 article details 118226389 在Windows系统下 当程序出现崩溃 虽然没有主动调用QSharedMemory attach 但是系统会自动回收Q