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

文章讨论了在Windows和Linux系统下,Qt程序利用QSharedMemory进行进程间通信时,如何处理程序崩溃后的内存回收。在Windows中,系统会自动回收,而在Linux中则需要手动处理。文中提供了一段代码示例,展示如何在Linux中确保共享内存正确创建和释放,以防止已运行的应用程序阻止新实例启动。
摘要由CSDN通过智能技术生成

感谢这位博主: 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。最后再创建,如果还是失败,说明进程确实在运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值