我正在使用实现一个应用程序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)
到目前为止,一切都很好。当我的应用程序由于某种原因崩溃时就会出现问题。崩溃时,共享内存没有被清除,所以我无法再打开应用程序。当它崩溃时,附加的应用程序计数变为0,但共享内存不会被删除。相关截图如下
据我了解,由于共享内存的状态未标记为dest
与其他共享内存一样,即使没有任何附加进程,它也不会被删除。
所以,我的问题是有没有办法将共享内存的状态标记为dest
?
Quoting 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)