我使用Qt和努力实现由应用this解决方案的Linux(Ubuntu的)一个单实例应用程序。问题是,如果应用程序意外完成(seg。fault或用户终止它),共享内存将保持连接状态,并且其他进程不能再次创建它。从QSharedMemory回收文档:C++共享内存泄漏,如何清除共享内存?
Unix:QSharedMemory“拥有”共享内存段。当最后一个 线程或进程的QSharedMemory实例连接到一个 特定共享内存段从该段分离 销毁它的QSharedMemory实例时,Unix内核释放 共享内存段。但是,如果最后一个线程或进程崩溃 而不运行QSharedMemory析构函数,共享内存 段生存的崩溃。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// Ensure single instanse of Cevirgec application
QSharedMemory shared(ApplicationConstants::
if(!shared.create(512, QSharedMemory::ReadWrite))
{
// QMessageBox msgBox;
QMessageBox::critical(0, QObject::tr("application is already running!"), QObject::tr("application is already running!"), QMessageBox::Ok, QMessageBox::Ok);
qCritical() << "application is already running!";
exit(0);
}
else {
qDebug() << "application staring...";
}
return a.exec();
}
你可以建议在这里有什么解决办法?我怎样才能确保在进程最终完成后清除共享内存(或通常使用的任何动词)。我需要在Java类似finally
各地主要功能:在(解决方案)
我以QSharedMemory和捕获SIGSEGV信号,然后调用sharedMemory.detach达到了预期的行为():/
编辑信号处理程序。
您可能不应该试图创建一个与操作系统和用户期望应用程序行为不同的应用程序。如果操作系统的标准行为使得用户希望能够启动多个实例,如在Windows和Linux上,那么他们应该能够。如果标准行为是强制一个实例,就像在Mac上一样,然后让操作系统自己执行。 – bames53
那么在操作系统中没有这种行为的标准。它完全取决于应用程序 – destan
bames53:有大量应用程序只允许您启动一个实例,有时这是合乎逻辑的事情。 – rubenvb