2017-03-02 1 views
1

ich eine Anwendung Umsetzung Qt C++ mit denen ich verwendet habe QSharedMemory mehrere Instanzen der Anwendung zu beschränken. Relevante Codesegment in main.cpp ist wie folgt,QSharedMemory ist nicht auf den Absturz der Anwendung gelöscht bekommen

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 */ 
} 

über die Anwendung zu öffnen, kann ich sehen, dass ein gemeinsam genutzter Speicher ist für meine Anwendung erstellt. (shmid 7.045.192, size 1B)

enter image description here

So weit so gut. Problem tritt auf, wenn meine Anwendung aus irgendeinem Grund abstürzt. Beim Absturz wird das sharedMemory nicht gelöscht, sodass ich die Anwendung nicht mehr öffnen kann. Wenn es abstürzt, wird die Anzahl der angehängten Anwendungen 0, aber der gemeinsam genutzte Speicher wird nicht gelöscht. Relevante screen-shot ist wie folgt

enter image description here

Gemäß wie mein Verständnis, wie der Status des gemeinsam genutzten Speichers wird als dest wie andere gemeinsame Speicher nicht markiert ist, wird es nicht einmal gelöscht wird, wenn es keine ist angehängter Prozess.

Also, meine Frage ist, dass ist es eine Möglichkeit, Status des Shared Memory als dest der Kennzeichnung?

Antwort

4

Zitiert QSharedMemory Dokumentation:

Wenn diese Klasse unter Verwendung der folgenden Plattform Unterschiede bewusst sein:

Fenster: QSharedMemory nicht "besitzt" das Shared-Memory-Segment. Wenn alle Threads oder Prozesse, das eine Instanz QSharedMemory hat zu einem bestimmten gemeinsamen genutzten Speichersegment angebracht sind entweder ihre Instanz QSharedMemory zerstört oder beendet, gibt das Windows-Kernel das gemeinsam benutzte Speichersegment automatisch.

Unix: QSharedMemory "besitzt" das Shared-Memory-Segment. Wenn der letzte Thread oder Prozess, der eine Instanz von QSharedMemory an einem bestimmten freigegebenen Speichersegment angehängt hat, von von seinem Segment von QSharedMemory löscht, gibt der Unix-Kernel das freigegebene Speichersegment frei. Aber wenn dieser letzte Thread oder dieser letzte Prozess abstürzt, ohne den Destruktor QSharedMemory auszuführen, überlebt das Segment des gemeinsamen Speichers den Absturz.

HP-UX: Nur ein auf einen gemeinsam genutzten Speichersegment befestigen ist pro Prozess erlaubt. Dies bedeutet, dass QSharedMemory nicht über mehrere Threads in demselben Prozess in HP-UX verwendet werden sollte.

ich das gleiche Problem auf Linux vor einigen Jahren hinzuzufügen haben, wir das Problem gelöst, indem diese Schritte tun:

// 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 
+0

Das ist wirklich gute Lösung. Es hat perfekt funktioniert. Vielen Dank. –

+0

Gute Lösung, danke. –

+0

Sie können auch: 1- Init shm 2- anhängen/trennen 3- Aktivieren Sie hier, wenn Sie erstellen können. Auf diese Weise ist es besser lesbar und du hast kein x2 'if'. Aber danke, diese Lösung hat meinen Tag gerettet !! – user2629409

Verwandte Themen