Я использую Qt и пытаюсь создать приложение с одним экземпляром, применяя это решение в Linux (убунту) . Проблема в том, что если приложение неожиданно завершает свою работу (сегмент. Ошибка или пользователь убивает его), разделяемая память остается подключенной, и никакой другой процесс не может создать ее снова. Вспомните из документа QSharedMemory:
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();
}
Какие решения вы можете здесь предложить? Как я могу гарантировать, что общая память очищается (или любой другой используемый глагол) после того, как процесс в конечном итоге завершится. Мне нужно что-то вроде finally
в java вокруг основной функции: /
EDIT: (Решение)
Я добился желаемого поведения, используя QSharedMemory и перехватив сигнал SIGSEGV, затем вызываю sharedMemory .detach () в обработчике сигналов.