Я реализую приложение, используя 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
?
квотирование 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
Других решений пока нет …