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)

введите описание изображения здесь

Все идет нормально. Проблема возникает, когда мое приложение по какой-то причине падает. При сбое sharedMemory не очищается, поэтому я больше не могу открыть приложение. В случае сбоя счетчик подключенных приложений становится равным 0, но общая память не удаляется. Соответствующий снимок экрана выглядит следующим образом

введите описание изображения здесь

Насколько я понимаю, состояние общей памяти не помечено как dest как и другие общие воспоминания, он не удаляется, даже если нет прикрепленного процесса.

Итак, мой вопрос заключается в том, есть ли способ пометить статус общей памяти как dest ?

1

Решение

квотирование 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
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]