Linux下使用QSharedMemory异常退出时共享内存未释放解决办法

2023-11-14

首先看一下QSharedMemory在不同平台下的差异问题

详细描述

QSharedMemory 类提供了对一段共享内存的访问。(译注:“一段共享内存”在后续译文中也译为“共享内存段”)

QSharedMemory 提供了被多线程和多进程共享的一段内存的访问。它也提供了方法,为单线程或单进程锁定内存以实现互斥访问。

当使用这个类的时候,要知道以下不同平台的差异:

  • Windows: QSharedMemory并不“拥有”这段共享内存。当所有“拥有一个QSharedMemory的实例从而附着于某一段共享内存”的进程或线程销毁了它们的QSharedMemory实例或者退出了,Windows内核会自动释放这一段共享内存。
  • Unix: QSharedM“拥有”这段共享内存。当最后一个拥有附着于某段共享内存的线程或进程通过销毁QSharedMemory实例从而与这段共享内存分离后,Unix内核会释放这段共享内存。但是如果最后这个线程或进程崩溃了而没有运行QSharedMemory的析构函数时,这段共享内存会逃过本次崩溃而没有被释放。
  • HP-UX: 每个进程只有一个线程能够附着于(attach to)一段共享内存。这就是说,在HP-UX上,QSharedMemory不应该被同一个进程内的多线程使用。

在读写共享内存前,要用lock();而在使用完毕后,要用unlock()来结束锁定。

我在windows系统上使用QSharedMemory的时候没出现任何问题,当把工程移到Linux系统上时,出现了问题,由于我的工程是一个QCoreApplication程序,当程序异常退出时,QSharedMemory实例对象未析构导致共享内存会处于挂机状态,后面启动该程序会一直报共享内存已存在的错误。为了解决异常退出时出现的内存挂起状态。

使用如下方法可解决在linux系统下异常退出导致的问题。

在创建内存时调用
bool create(int size, AccessMode mode = ReadWrite)如果错误为QSharedMemory::AlreadyExists,表示共享内存已存在未被释放,则需要调用

先attach函数将进程附着到QSharedMemory上,再调用detach函数即可释放掉该异常导致的挂起共享内存,然后便可重新创建内存。

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

Linux下使用QSharedMemory异常退出时共享内存未释放解决办法 的相关文章

  • 简单的 C++ 线程

    我正在尝试在 C Win32 中创建一个线程来运行一个简单的方法 我是 C 线程的新手 但对 C 中的线程非常熟悉 这是我想做的一些伪代码 static void MyMethod int data RunStuff data void R
  • C 中的分段错误

    我需要用 0 填充二维数组 但编译后的程序会出现此错误 怎么了 int main int vert 1001 1001 int hor 1001 1001 int dudiag 1416 1416 int uddiag 1416 1416
  • 对相当大的整数的大集合的操作的快速实现

    描述 我实现了以下类 LabSetInt64 参见下面的代码 这里的目标是尽可能快地操作大量大整数 最多 10M 的值 我的主要要求集中在 至关重要 尽快获取集合的大小 基数 重要 能够非常快速地迭代一组集合 所以 从下面的实现开始 我还有
  • 将内核链接到 PTX 函数

    我可以使用 PTX 文件中包含的 PTX 函数作为外部设备函数 将其链接到另一个应调用该函数的 cu 文件吗 这是另一个问题CUDA 将内核链接在一起 https stackoverflow com questions 20636800 c
  • 设置外部应用程序焦点

    在 VB NET 中 您可以使用以下命令将焦点设置到外部应用程序 AppActivate Windows Name or AppActivate processID As Integer 现在 如果您这样做 则效果很好 Dim intNot
  • 整数与双精度算术性能?

    我正在编写一个 C 类来使用整数执行 2D 可分离卷积 以获得比双对应更好的性能 问题是我没有获得真正的性能提升 这是 X 过滤器代码 对于 int 和 double 情况都有效 foreach pixel int value 0 for
  • 将任何当前目录“./”添加到Linux中的搜索路径[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何将任何当前目录 添加到 Linux 中可执行文件的搜索路径中 我知道这是一个旧答案 但如果其他人像我一样通过谷歌偶然发现这个问题 这里
  • 为什么测试在 TeamCity 中运行比直接在 NUnit 中运行需要更长的时间?

    我进行了一些 C 性能测试 基本上运行两种不同的方法 并检查一种方法的运行速度是否比另一种方法快得多 当我在 NUnit 本地运行它们时 其中一个测试的运行速度是另一个测试的十倍 因此我有一个 NUnit 测试 它使用Stopwatch检查
  • 使用 MapViewOfFile 有什么限制吗?

    我正在尝试将内存映射文件用作 hFile CreateFile State Path GENERIC READ FILE SHARE READ FILE SHARE WRITE 0 OPEN EXISTING FILE FLAG SEQUE
  • 适用于 Windows 的键值数据库?

    除了 MongoDB 和 Memcached 之外 Windows 上还运行哪些键值存储 我见过的大多数似乎只能在 Linux 上运行 Hypertable Redis Lightcloud 相关链接 是否有经过商业验证的云存储 Key g
  • 复杂的 C 声明

    我刚刚在互联网上浏览了一些代码 发现了这个 float foo SIZE SIZE 我如何阅读这份声明 是否有一套特定的规则来阅读如此复杂的声明 我有一段时间没做这个了 从 开始foo然后向右走 float foo SIZE SIZE fo
  • 设置 nginx 具有多个 IP

    我的 nginx 配置文件位于 etc nginx sites available 下 有两个上游说 upstream test1 server 1 1 1 1 50 server 1 1 1 2 50 upstream test2 ser
  • C语言:如何获取使用strtok()一次后剩余的字符串

    我的字符串是 A B C D E 分隔符是 如何获取执行 strtok 一次后剩余的字符串 即 B C D E char a A B C D E char separator char b strtok a separator printf
  • 一个对大文件有效的轻量级 XML 解析器?

    我需要解析潜在的巨大 XML 文件 所以我猜这排除了 DOM 解析器 是否有任何优秀的 C 轻量级 SAX 解析器 在占用空间上可与 TinyXML 相媲美 XML的结构非常简单 不需要诸如命名空间和DTD之类的高级东西 只是元素 属性和
  • Global.asax 错误处理程序或自定义 IHttpModule 错误处理程序未捕获未处理的异常

    我有一个类 DPCal EventMove 的一种方法 我想限制使用角色的访问 我有一个 Global asax cs 错误处理程序和一个自定义 IHttpModule 错误处理程序 旨在捕获未处理的异常 并将它们 Server Trans
  • 如何从句柄确定进程是 32 位还是 64 位?

    如何从使用 OpenProcess 获取的进程句柄中获取信息 无论进程是 32 位还是 64 位 是的 IsWow64Process 毫无用处 令人烦恼 它的真正意思是 启用了 32 位模拟 如果您在 32 位操作系统上运行 则返回 fal
  • C# 编译器编译 .txt .obj .java 文件

    using System class Program public static void Main Console WriteLine Hello World Console ReadLine 我将文件另存为1 java 2 obj an
  • 检测用户是否正在滚动 dataGridView 滚动条

    我正在更新一个dataGridView与一个新的数据表使用 dataGridView1 DataSource table 但是 我不想在用户滚动 dataGridView 时执行此操作 如何检查滚动条是否正在滚动或已完成滚动 即拖动而不是单
  • 序列化时如何跳过 xml 声明?

    我正在尝试输出一个没有 xml 头的 xml 文件 例如 我试过 Type t obj GetType XmlSerializer xs new XmlSerializer t XmlWriter xw XmlWriter Create c
  • RabbitMQ + Windows + LDAP 无需发送密码

    我正在尝试在 Windows 7 上使用 RabbitMQ 3 6 2 进行 LDAP 身份验证 授权 我已经在应用程序发送用户名 密码的情况下进行了基本身份验证 但密码位于我需要弄清楚如何进行的代码中避免 有没有人在不提供密码的情况下成功

随机推荐

  • git上传遇到 GitHub could not read Username 的解决办法

    Gitversion 1 8 5 2 执行git push命令异常 如下 1 Push failed 2 Failed with error unable to read askpass response from C Users eddy
  • Springboot学习笔记5:整合JDBC

    一 什么是JDBC 在web开发中 不可避免的地要使用数据库来存储和管理数据 为了在java语言中提供数据库访问的支持 Sun公司于1996年提供了一套访问数据的标准Java类库 即JDBC JDBC的全称是Java数据库连接 Java D
  • computed与watch的区别

    一 computed与watch 在之前的练习中本人碰到computed来监听某个数据变化 我们都知道computed与watch都是可以监听数据变化 但具体要怎么区别它们呢 1 1 watch 1 1 1 watch的简单执行
  • xss原理和分类

    前言 准备智警杯的过程中 也不能掉下漏洞的学习 浅浅学习一下关于xss的一些知识 何为xss 全名跨站脚本攻击 也属于注入 属于代码注入的一种 由于未进行严格的过滤 haker可以将恶意代码注入到网页当中 其他用户在访问该网页时会执行恶意代
  • 真的!!!两行css代码实现瀑布流,html,css最简单的瀑布流实现方式且没有缺点!...

    给前端宇宙加星标 提升前端小宇宙 作者 coder94 https segmentfault com a 1190000017866549 两行css如下 列间距 可有可无 默认30px column gap 0 效果图如下
  • IDEA导入Spring源码环境搭建

    一 环境准备 1 Spring源码包 下载地址 https github com spring projects spring framework 2 gradle工具 下载地址 http downloads gradle org dist
  • 获取APP签名信息或者查看签名文件的MD5,SHA1,SHA256

    1 查看APP是否签名 将APP文件后缀改为 zip并解压会得到以下内容 CERT RSA就包含签名信息 然后运行命令 keytool printcert file Users Documents app release META INF
  • uni-app 开放生态

    uni app 积极拥抱社区 创建了开放 兼容的生态系统 uni app插件市场 有数千款插件 支持前端组件 js sdk 页面模板 项目模板 原生插件等多种类型 在生态建设上远远领先于竞品 兼容 微信小程序 JS SDK 丰富的小程序生态
  • sql注入之报错注入

    目录 1 常用报错的函数 2 其他函数 一 extractvalue 二 updetaxml 1 常用报错的函数 1 extractvalue 2 updataxml 3 floor 2 其他函数 1 substring extractva
  • 数论入门笔记

    数论入门笔记 目录 数论入门笔记 一 数论是什么 二 数论基础 1 欧几里德算法 辗转相除法 2 有关素数的基础算法 单个整数素性测试 简单素数筛 多个整数素性测试 埃氏筛法 Eratosthenes筛法 区间筛法 欧拉筛法 线性筛法 3
  • VC++ Gdiplus::Bitmap抠图

    void SetBackgroundMaskImage LPCTSTR lpszImageName COLORREF crAlpha RGB 255 0 0 Gdiplus Bitmap pBkgrMaskBitmap CImageFact
  • MYSQL中mysql数据库的用户表User表

    前言 新建MySQL时 会自动安装一个mysql的数据库 该数据库下面的表都是权限表 其中 user表是最重要权限表 记录了允许连接到服务器的账号信息以及一些全局权限信息 user表有42个字段 大致分为4类 用户列 权限列 安全列及资源控
  • Git安装与卸载

    Git下载 官网 https git scm com downloads 点击官网链接 跳转到官网 选择对应操作系统 根据操作系统位数选择相应版本下载安装包 淘宝镜像 http npm taobao org mirrors git for
  • 编译原理绪论

    1 美图 5 编译过程一语法分析 任务 在词法分析的基础上 根据语言的语法规则把单词符号串分解成各类语法单位 语法范畴 依循的原则 语法规则 描述工具 上下文无关文法 6 编译过程一中间代码产生 任务 对各类不同语法范畴按语言的语义进行初步
  • 自学黑客必读的15本书,少1本都算不上真正的超级黑客

    前言 网络安全和黑客技能紧密相连 想要有效地防范黑客攻击 了解黑客的技能和思维方式非常重要 而要想成为一名合格的白帽黑客 也需要深入理解网络安全的基本原理和最佳实践 本文将介绍15本网络安全和黑客书籍 既包括了防范黑客攻击的指南书籍 也包括
  • 天梯赛 L1-046 整除光棍(除法原理)

    这里所谓的 光棍 并不是指单身汪啦 说的是全部由1组成的数字 比如1 11 111 1111等 传说任何一个光棍都能被一个不以5结尾的奇数整除 比如 111111就可以被13整除 现在 你的程序要读入一个整数x 这个整数一定是奇数并且不以5
  • java基本类型知识点

    java基本类型 java虽然是纯面向对象的语言 但为了方便也设置了八中基本类型 它们是 类型 标识 字节数 引用类型写法 字段类型 byte 1字节 引用类型是Byte 短整型 short 2字节 引用类型是Short 整型 int 4字
  • 使用SSH与github远程服务器进行无密码连接

    在git操作窗口中运行 ssh keygen t rsa 一直回车连接 然后到 ssh目录下看到两个文件 用sublime打开这个文件如图 复制里面的密钥 打开自己的github主页 点击自己的头像下的setting看到ssh那里 创建ss
  • Matlab机器人工具箱Robotics ToolBox --rvctools安装 图文详解(附rvctools工具箱资源)

    rvctools工具箱资源地址分享 链接 https pan baidu com s 1DqeCwS0F P2DgQJQeL9boA 提取码 lmgp 首先找到你的Matlab安装位置 找到toolbox文件夹 例如我的位置是D Progr
  • Linux下使用QSharedMemory异常退出时共享内存未释放解决办法

    首先看一下QSharedMemory在不同平台下的差异问题 详细描述 QSharedMemory 类提供了对一段共享内存的访问 译注 一段共享内存 在后续译文中也译为 共享内存段 QSharedMemory 提供了被多线程和多进程共享的一段