【问题标题】:QSharedMemory is not getting deleted on Application crashQSharedMemory 不会在应用程序崩溃时被删除
【发布时间】:2017-03-02 08:08:06
【问题描述】:

我正在使用Qt C++ 实现一个应用程序,我使用QSharedMemory 来限制应用程序的多个实例。 main.cpp中的相关代码段如下,

QSharedMemory sharedMemory;
sharedMemory.setKey(SM_INSTANCE_KEY);

if (!sharedMemory.create(1))
{
    QMessageBox::warning(0, "Console", "An instance of this application is already running!" );
    exit(0); /* Exit, already a process is running */
}

打开应用程序时,我可以看到已为我的应用程序创建了共享内存。 (shmid7045192,size1B)

到目前为止一切顺利。当我的应用程序由于某种原因崩溃时,就会出现问题。崩溃时,sharedMemory 没有被清除,所以我无法再打开应用程序。当它崩溃时,附加的应用程序计数变为 0,但共享内存不会被删除。相关截图如下

据我了解,由于共享内存的状态没有像其他共享内存一样标记为dest,因此即使没有任何附加进程,它也不会被删除。

那么,我的问题是,有没有办法将共享内存的状态标记为 dest

【问题讨论】:

    标签: c++ qt shared-memory qsharedmemory


    【解决方案1】:

    引用QSharedMemory 文档:

    使用此类时,请注意以下平台差异:

    Windows:QSharedMemory 不“拥有”共享内存段。当所有具有 QSharedMemory 实例的线程或进程 附加到特定共享内存段的已销毁 他们的 QSharedMemory 实例或已退出,Windows 内核发布 共享内存段。

    Unix:QSharedMemory“拥有”共享内存段。当最后一个附加了 QSharedMemory 实例的线程或进程时 到一个特定的共享内存段与该段分离 销毁其 QSharedMemory 实例,Unix 内核释放 共享内存段。但是如果最后一个线程或进程崩溃 在不运行 QSharedMemory 析构函数的情况下,共享内存 段在崩溃中幸存下来。

    HP-UX:每个进程只允许一个附加到共享内存段。这意味着不应跨使用 QSharedMemory HP-UX 中同一进程中的多个线程。

    几年前我在 Linux 上添加了相同的问题,我们通过执行这些步骤解决了问题:

    // Pseudo code
    if (create_share_memory() == failed)
    {
        // The failure may be caused by the shm already existing
        attach()
        detach() // This should delete the shm if no process use it
        if (create_share_memory() == failed)
        {
           // We really cannot create the share memory, report the error
           return failed
        }
    }
    return ok
    

    【讨论】:

    • 您还可以: 1- 初始化 shm 2- 附加/分离 3- 如果可以创建,请在此处检查。这样它更具可读性,并且您没有 x2 'if'。但是谢谢,这个修复拯救了我的一天!
    • @user2629409 它简化了代码,但如果您不希望共享内存存在,则会以降低性能为代价。也就是说,如果共享内存已经存在的情况是异常的(例如由崩溃引起),在正常情况下您有 2 个额外的系统调用(应用程序没有崩溃,或者您位于自动销毁悬空 shm 的平台上: 99.9%)。对于某些需要性能的软件,您可能希望跳过额外的系统调用。但是,如果您预计大部分时间都需要附加/分离,那么是的,您应该删除第一个 if。
    • @Benjamin T 在 Linux 上,我每次都需要这样做。我使用共享内存来防止多次执行同一个应用程序。同时。所以对我来说,它是 Windows 和 OSX 一次的额外代码,在启动时 :)
    • @user2629409 如果是这样,您可能会对 QtSingleApplication 感兴趣:github.com/qtproject/qt-solutions/tree/master/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多