QSharedMemory Class

Die Klasse QSharedMemory ermöglicht den Zugriff auf ein gemeinsames Speichersegment. Mehr...

Kopfzeile: #include <QSharedMemory>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Vererbungen: QObject

Öffentliche Typen

enum AccessMode { ReadOnly, ReadWrite }
enum SharedMemoryError { NoError, PermissionDenied, InvalidSize, KeyError, AlreadyExists, …, UnknownError }

Öffentliche Funktionen

QSharedMemory(const QString &key, QObject *parent = nullptr)
QSharedMemory(QObject *parent = nullptr)
QSharedMemory(const QNativeIpcKey &key, QObject *parent = nullptr)
virtual ~QSharedMemory()
bool attach(QSharedMemory::AccessMode mode = ReadWrite)
const void *constData() const
bool create(qsizetype size, QSharedMemory::AccessMode mode = ReadWrite)
void *data()
const void *data() const
bool detach()
QSharedMemory::SharedMemoryError error() const
QString errorString() const
bool isAttached() const
QString key() const
bool lock()
(since 6.6) QNativeIpcKey nativeIpcKey() const
QString nativeKey() const
void setKey(const QString &key)
(since 6.6) void setNativeKey(const QNativeIpcKey &key)
void setNativeKey(const QString &key, QNativeIpcKey::Type type = QNativeIpcKey::legacyDefaultTypeForOs())
qsizetype size() const
bool unlock()

Detaillierte Beschreibung

QSharedMemory ermöglicht den Zugriff auf ein gemeinsames Speichersegment durch mehrere Threads und Prozesse. Gemeinsam genutzte Speichersegmente werden durch einen Schlüssel identifiziert, der durch QNativeIpcKey dargestellt wird. Ein Schlüssel kann plattformübergreifend mit platformSafeKey() erstellt werden.

Ein QSharedMemory-Objekt muss das Segment create() und dieser Aufruf gibt die Größe des Segments an. Alle anderen Prozesse verweisen einfach mit attach() auf das Segment, das bereits existieren muss. Nachdem eine der beiden Operationen erfolgreich war, kann die Anwendung data() aufrufen, um einen Zeiger auf die Daten zu erhalten.

Um nicht-atomare Operationen zu unterstützen, bietet QSharedMemory eine API, um exklusiven Zugriff zu erhalten: Sie können den gemeinsamen Speicher mit lock() sperren, bevor Sie aus dem gemeinsamen Speicher lesen oder in ihn schreiben, aber denken Sie daran, die Sperre mit unlock() aufzuheben, wenn Sie fertig sind.

Standardmäßig zerstört QSharedMemory das gemeinsame Speichersegment automatisch, wenn die letzte Instanz von QSharedMemory detached aus dem Segment ist und keine Referenzen auf das Segment mehr bestehen.

Details zu den Schlüsseltypen, plattformspezifischen Einschränkungen und der Interoperabilität mit älteren oder Nicht-Qt-Anwendungen finden Sie in der Dokumentation Native IPC Keys. Diese enthält wichtige Informationen für Sandbox-Anwendungen auf Apple-Plattformen, einschließlich aller über den Apple App Store bezogenen Anwendungen.

Siehe auch Inter-Process Communication und QSystemSemaphore.

Member-Typ-Dokumentation

enum QSharedMemory::AccessMode

KonstanteWertBeschreibung
QSharedMemory::ReadOnly0Das gemeinsame Speichersegment ist schreibgeschützt. Das Schreiben in das gemeinsame Speichersegment ist nicht erlaubt. Der Versuch, in ein mit ReadOnly erstelltes gemeinsames Speichersegment zu schreiben, führt zum Abbruch des Programms.
QSharedMemory::ReadWrite1Lesen und Schreiben des gemeinsamen Speichersegments sind beide erlaubt.

enum QSharedMemory::SharedMemoryError

KonstanteWertBeschreibung
QSharedMemory::NoError0Es ist kein Fehler aufgetreten.
QSharedMemory::PermissionDenied1Der Vorgang schlug fehl, weil der Aufrufer nicht über die erforderlichen Berechtigungen verfügte.
QSharedMemory::InvalidSize2Ein Erstellungsvorgang schlug fehl, weil die angeforderte Größe ungültig war.
QSharedMemory::KeyError3Der Vorgang schlug wegen eines ungültigen Schlüssels fehl.
QSharedMemory::AlreadyExists4Ein create()-Vorgang schlug fehl, weil ein gemeinsames Speichersegment mit dem angegebenen Schlüssel bereits vorhanden war.
QSharedMemory::NotFound5Ein attach() schlug fehl, weil ein gemeinsames Speichersegment mit dem angegebenen Schlüssel nicht gefunden werden konnte.
QSharedMemory::LockError6Der Versuch, das gemeinsame Speichersegment lock() zu öffnen, ist fehlgeschlagen, weil create() oder attach() fehlgeschlagen ist und false zurückgegeben hat, oder weil ein Systemfehler in QSystemSemaphore::acquire() aufgetreten ist.
QSharedMemory::OutOfResources7Ein create()-Vorgang ist fehlgeschlagen, weil nicht genügend Speicher für die Anforderung verfügbar war.
QSharedMemory::UnknownError8Es ist etwas anderes passiert und es war schlecht.

Dokumentation der Mitgliedsfunktionen

QSharedMemory::QSharedMemory(const QString &key, QObject *parent = nullptr)

Konstruiert ein Shared-Memory-Objekt mit dem angegebenen parent und mit dem auf key gesetzten Legacy-Schlüssel. Da der Schlüssel gesetzt ist, können die Funktionen create() und attach() aufgerufen werden.

Siehe auch setKey(), create(), und attach().

QSharedMemory::QSharedMemory(QObject *parent = nullptr)

Diese Funktion überlädt QSharedMemory().

Konstruiert ein Shared-Memory-Objekt mit der angegebenen parent. Der Schlüssel des Shared-Memory-Objekts wird vom Konstruktor nicht gesetzt, so dass dem Shared-Memory-Objekt kein zugrunde liegendes Shared-Memory-Segment zugeordnet ist. Der Schlüssel muss mit setNativeKey() gesetzt werden, bevor create() oder attach() verwendet werden können.

Siehe auch setNativeKey().

QSharedMemory::QSharedMemory(const QNativeIpcKey &key, QObject *parent = nullptr)

Dies ist eine überladene Funktion.

Konstruiert ein Shared-Memory-Objekt mit dem angegebenen parent und mit dem auf key gesetzten Schlüssel. Da der Schlüssel gesetzt ist, können die Funktionen create() und attach() aufgerufen werden.

Siehe auch setNativeKey(), create(), und attach().

[virtual noexcept] QSharedMemory::~QSharedMemory()

Der Destruktor löscht den Schlüssel, wodurch das gemeinsame Speicherobjekt gezwungen wird, detach von seinem zugrunde liegenden gemeinsamen Speichersegment zu verlassen. Wenn dieses gemeinsame Speicherobjekt das letzte ist, das mit dem gemeinsamen Speichersegment verbunden ist, zerstört die Operation detach() das gemeinsame Speichersegment.

Siehe auch detach() und isAttached().

bool QSharedMemory::attach(QSharedMemory::AccessMode mode = ReadWrite)

Versucht, den Prozess an das gemeinsame Speichersegment anzuhängen, das durch den Schlüssel identifiziert wird, der an den Konstruktor oder an einen Aufruf von setNativeKey() übergeben wurde. Der Zugriff mode ist standardmäßig ReadWrite. Er kann auch ReadOnly sein. Gibt true zurück, wenn der Attach-Vorgang erfolgreich war. Wenn false zurückgegeben wird, rufen Sie error() auf, um festzustellen, welcher Fehler aufgetreten ist. Nach dem Anhängen des gemeinsamen Speichersegments kann ein Zeiger auf den gemeinsamen Speicher durch Aufruf von data() erhalten werden.

Siehe auch isAttached(), detach(), und create().

const void *QSharedMemory::constData() const

Gibt einen konstanten Zeiger auf den Inhalt des gemeinsamen Speichersegments zurück, falls ein solches vorhanden ist. Andernfalls gibt sie null zurück. Der von dieser Funktion zurückgegebene Wert ändert sich nicht, bis detach aufgerufen wird, so dass es sicher ist, diesen Zeiger zu speichern.

Wenn die Speicheroperationen nicht atomar sind, können Sie den gemeinsamen Speicher mit lock() sperren, bevor Sie lesen oder schreiben, aber denken Sie daran, die Sperre mit unlock() aufzuheben, wenn Sie fertig sind.

Siehe auch attach() und create().

bool QSharedMemory::create(qsizetype size, QSharedMemory::AccessMode mode = ReadWrite)

Erzeugt ein gemeinsames Speichersegment von size Bytes mit dem Schlüssel, der dem Konstruktor übergeben oder mit setNativeKey() gesetzt wurde, fügt dann an das neue gemeinsame Speichersegment mit dem angegebenen Zugriff mode an und gibt true zurück. Wenn ein gemeinsames Speichersegment, das durch den Schlüssel identifiziert wird, bereits existiert, wird der Anfügevorgang nicht durchgeführt und false zurückgegeben. Wenn der Rückgabewert false ist, rufen Sie error() auf, um festzustellen, welcher Fehler aufgetreten ist.

Siehe auch error().

void *QSharedMemory::data()

Gibt einen Zeiger auf den Inhalt des gemeinsamen Speichersegments zurück, falls eines vorhanden ist. Andernfalls gibt sie null zurück. Der von dieser Funktion zurückgegebene Wert ändert sich nicht, bis eine detach erfolgt, so dass es sicher ist, diesen Zeiger zu speichern.

Wenn die Speicheroperationen nicht atomar sind, können Sie den gemeinsamen Speicher mit lock() sperren, bevor Sie lesen oder schreiben, aber denken Sie daran, die Sperre mit unlock() aufzuheben, wenn Sie fertig sind.

Siehe auch attach().

const void *QSharedMemory::data() const

Diese Funktion überlastet data().

bool QSharedMemory::detach()

Entfernt den Prozess aus dem gemeinsamen Speichersegment. Wenn dies der letzte Prozess war, der an das gemeinsame Speichersegment angeschlossen war, wird das gemeinsame Speichersegment vom System freigegeben, d.h. der Inhalt wird zerstört. Die Funktion gibt true zurück, wenn sie das gemeinsame Speichersegment loslöst. Wenn sie false zurückgibt, bedeutet dies in der Regel, dass das Segment entweder nicht angehängt ist oder von einem anderen Prozess gesperrt wurde.

Siehe auch attach() und isAttached().

QSharedMemory::SharedMemoryError QSharedMemory::error() const

Gibt einen Wert zurück, der angibt, ob ein Fehler aufgetreten ist, und wenn ja, welcher Fehler es war.

Siehe auch errorString().

QString QSharedMemory::errorString() const

Gibt eine Textbeschreibung des zuletzt aufgetretenen Fehlers zurück. Wenn error() ein error value zurückgibt, rufen Sie diese Funktion auf, um eine Textzeichenkette zu erhalten, die den Fehler beschreibt.

Siehe auch error().

bool QSharedMemory::isAttached() const

Gibt true zurück, wenn dieser Prozess mit dem gemeinsamen Speichersegment verbunden ist.

Siehe auch attach() und detach().

QString QSharedMemory::key() const

Gibt den Legacy-Schlüssel zurück, der mit setKey() diesem gemeinsamen Speicher zugewiesen wurde, oder einen Null-Schlüssel, wenn kein Schlüssel zugewiesen wurde oder wenn das Segment nativeKey() verwendet. Der Schlüssel ist der Bezeichner, der von Qt-Anwendungen verwendet wird, um das Segment des gemeinsamen Speichers zu identifizieren.

Sie können den nativen, plattformspezifischen Schlüssel, der vom Betriebssystem verwendet wird, durch den Aufruf von nativeKey() ermitteln.

Siehe auch setKey() und setNativeKey().

bool QSharedMemory::lock()

Dies ist eine Semaphore, die das gemeinsame Speichersegment für den Zugriff durch diesen Prozess sperrt und true zurückgibt. Wenn ein anderer Prozess das Segment gesperrt hat, blockiert diese Funktion, bis die Sperre aufgehoben wird. Dann erwirbt sie die Sperre und gibt true zurück. Wenn diese Funktion false zurückgibt, bedeutet dies, dass Sie eine falsche Rückgabe von create() oder attach() ignoriert haben, dass Sie den Schlüssel mit setNativeKey() gesetzt haben oder dass QSystemSemaphore::acquire() aufgrund eines unbekannten Systemfehlers fehlgeschlagen ist.

Siehe auch unlock(), data(), und QSystemSemaphore::acquire().

[since 6.6] QNativeIpcKey QSharedMemory::nativeIpcKey() const

Gibt den Schlüsseltyp für dieses Shared-Memory-Objekt zurück. Der Schlüsseltyp ergänzt die nativeKey() als Bezeichner, der vom Betriebssystem zur Identifizierung des gemeinsamen Speichersegments verwendet wird.

Sie können den nativen Schlüssel verwenden, um auf Shared-Memory-Segmente zuzugreifen, die nicht von Qt erstellt wurden, oder um Nicht-Qt-Anwendungen Zugriff auf Shared Memory zu gewähren. Siehe Native IPC Keys für weitere Informationen.

Diese Funktion wurde in Qt 6.6 eingeführt.

Siehe auch nativeKey() und setNativeKey().

QString QSharedMemory::nativeKey() const

Gibt den nativen, plattformspezifischen Schlüssel für dieses Shared-Memory-Objekt zurück. Der native Schlüssel ist der Bezeichner, der vom Betriebssystem verwendet wird, um das gemeinsame Speichersegment zu identifizieren.

Sie können den nativen Schlüssel verwenden, um auf Shared-Memory-Segmente zuzugreifen, die nicht von Qt erstellt wurden, oder um Nicht-Qt-Anwendungen Zugriff auf Shared Memory zu gewähren. Siehe Native IPC-Schlüssel für weitere Informationen.

Siehe auch setNativeKey() und nativeIpcKey().

void QSharedMemory::setKey(const QString &key)

Dies ist eine überladene Funktion.

Setzt die alte key für dieses Shared-Memory-Objekt. Wenn key derselbe ist wie der aktuelle Schlüssel, kehrt die Funktion zurück, ohne etwas zu tun. Andernfalls, wenn das Shared-Memory-Objekt an ein darunter liegendes Shared-Memory-Segment angehängt ist, wird es von diesem detach, bevor der neue Schlüssel gesetzt wird. Diese Funktion führt keine attach() aus.

Sie können key() aufrufen, um den Legacy-Schlüssel abzurufen. Diese Funktion ist weitgehend identisch mit:

shm.setNativeKey(QSharedMemory::legacyNativeKey(key));

mit der Ausnahme, dass sie die Abfrage des alten Schlüssels mit key() ermöglicht.

Siehe auch key(), nativeKey(), und isAttached().

[since 6.6] void QSharedMemory::setNativeKey(const QNativeIpcKey &key)

Setzt den nativen, plattformspezifischen key für dieses Shared-Memory-Objekt. Wenn key derselbe ist wie der aktuelle native Schlüssel, kehrt die Funktion zurück, ohne etwas zu tun. Andernfalls, wenn das Shared-Memory-Objekt an ein darunter liegendes Shared-Memory-Segment angehängt ist, wird es von diesem detach, bevor der neue Schlüssel gesetzt wird. Diese Funktion führt keine attach() aus.

Diese Funktion ist nützlich, wenn der native Schlüssel von einem anderen Prozess freigegeben wurde. Siehe Native IPC-Schlüssel für weitere Informationen.

Portable native Schlüssel können mit platformSafeKey() erhalten werden.

Sie können nativeKey() aufrufen, um den nativen Schlüssel zu erhalten.

Diese Funktion wurde in Qt 6.6 eingeführt.

Siehe auch nativeKey(), nativeIpcKey(), und isAttached().

void QSharedMemory::setNativeKey(const QString &key, QNativeIpcKey::Type type = QNativeIpcKey::legacyDefaultTypeForOs())

Setzt den nativen, plattformspezifischen, key für dieses Shared-Memory-Objekt vom Typ type (der Typ-Parameter ist seit Qt 6.6 verfügbar). Wenn key derselbe ist wie der aktuelle native Schlüssel, kehrt die Funktion zurück, ohne etwas zu tun. Andernfalls, wenn das Shared-Memory-Objekt an ein darunter liegendes Shared-Memory-Segment angehängt ist, wird es von diesem detach, bevor der neue Schlüssel gesetzt wird. Diese Funktion führt keine attach() aus.

Diese Funktion ist nützlich, wenn der native Schlüssel von einem anderen Prozess freigegeben wurde, obwohl die Anwendung darauf achten muss, dass der Schlüsseltyp dem entspricht, was der andere Prozess erwartet. Siehe Native IPC-Schlüssel für weitere Informationen.

Portable native Schlüssel können mit platformSafeKey() erhalten werden.

Sie können nativeKey() aufrufen, um den nativen Schlüssel zu erhalten.

Siehe auch nativeKey(), nativeIpcKey(), und isAttached().

qsizetype QSharedMemory::size() const

Gibt die Größe des angehängten gemeinsamen Speichersegments zurück. Wenn kein gemeinsames Speichersegment angehängt ist, wird 0 zurückgegeben.

Hinweis: Die Größe des Segments kann größer sein als die angeforderte Größe, die an create() übergeben wurde.

Siehe auch create() und attach().

bool QSharedMemory::unlock()

Gibt die Sperre für das gemeinsame Speichersegment frei und gibt true zurück, wenn die Sperre derzeit von diesem Prozess gehalten wird. Wenn das Segment nicht gesperrt ist oder wenn die Sperre von einem anderen Prozess gehalten wird, passiert nichts und false wird zurückgegeben.

Siehe auch lock().

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.