在Application崩溃时,QSharedMemory没有被删除

时间:2017-03-02 08:08:06

标签: c++ qt shared-memory qsharedmemory

我正在使用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 */
}

在打开应用程序时,我可以看到已为我的应用程序创建了共享内存。 (shmid 7045192,size 1B)

enter image description here

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

enter image description here

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

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

1 个答案:

答案 0 :(得分:7)

引用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