Я использую Qt и пытаюсь создать приложение для одного экземпляра, применяя это решение в Linux (ubuntu) .Проблема заключается в том, что если приложение неожиданно завершает работу (ошибка сегмента или пользователь убивает его), общая память остается подключенной, и никакой другой процесс не может создать ее снова.Отзыв из QSharedMemory doc:
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 по всей основной функции: /
РЕДАКТИРОВАТЬ: (Решение)
Я добился желаемого поведения с помощью QSharedMemory и перехватаСигнал SIGSEGV затем вызывает sharedMemory.detach () в обработчике сигнала.