QSharedMemory 类

QSharedMemory 类提供了对共享内存段的访问。 更多信息...

头文件 #include <QSharedMemory>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
继承 QObject

公共类型

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

公共函数

QSharedMemory(const QString &key, QObject *parent = nullptr)
QSharedMemory(QObject *parent = nullptr)
QSharedMemory(const QNativeIpcKey &key, QObject *parent = nullptr)
虚拟~QSharedMemory()
boolattach(QSharedMemory::AccessMode mode = ReadWrite)
const void *constData() const
boolcreate(qsizetype size, QSharedMemory::AccessMode mode = ReadWrite)
void *data()
const void *data() const
booldetach()
QSharedMemory::SharedMemoryErrorerror() const
QStringerrorString() const
boolisAttached() const
QStringkey() const
boollock()
(自 6.6) QNativeIpcKeynativeIpcKey() const
QStringnativeKey() const
voidsetKey(const QString &key)
(自 6.6) voidsetNativeKey(const QNativeIpcKey &key)
voidsetNativeKey(const QString &key, QNativeIpcKey::Type type = QNativeIpcKey::legacyDefaultTypeForOs())
qsizetypesize() const
boolunlock()

详细说明

QSharedMemory 通过多个线程和进程访问共享内存段。共享内存段通过 共享内存段QNativeIpcKey 进行标识。可以使用 platformSafeKey() 以跨平台方式创建一个密钥。

一个QSharedMemory对象必须创建()段并指定段的长度。所有其他进程只需附加()到已存在的段上。在任一操作成功后,应用程序可以调用data()以获取数据指针。

为了支持非原子操作,QSharedMemory提供了获取独占访问的API:在从或向共享内存读取或写入之前,你可以使用lock()锁定共享内存,但完成后记得使用unlock()解锁。

默认情况下,当最后一个QSharedMemory实例从段中分离且没有段引用时,QSharedMemory将自动销毁共享内存段。

有关键类型、平台特定的限制以及与较旧或非Qt应用程序的互操作性的详细信息,请参阅本地IPC密钥文档。其中包括适用于Apple平台沙箱应用程序的重要信息,包括通过Apple应用商店获取的所有应用程序。

另请参阅进程间通信QSystemSemaphore

成员类型文档

枚举 QSharedMemory::AccessMode

常数描述
QSharedMemory::ReadOnly0共享内存段为只读。不允许向共享内存段写入。使用ReadOnly创建共享内存段时尝试写入会导致程序中止。
QSharedMemory::ReadWrite1允许读取和写入共享内存段。

枚举 QSharedMemory::SharedMemoryError

常数描述
QSharedMemory::NoError0没有错误发生。
QSharedMemory::PermissionDenied1由于调用者没有所需的权限,操作失败。
QSharedMemory::InvalidSize2由于请求的大小无效,创建操作失败。
QSharedMemory::KeyError3由于密钥无效,操作失败。
QSharedMemory::AlreadyExists4由于指定的键的共享内存段已存在,创造操作失败。
QSharedMemory::NotFound5由于无法找到指定的键的共享内存段,附加操作失败。
QSharedMemory::LockError6尝试锁定共享内存段失败,因为创造或附加失败并返回了false,或者因为在QSystemSemaphore::acquire()中发生了系统错误。
QSharedMemory::OutOfResources7由于没有足够的内存来填充请求,创造操作失败。
QSharedMemory::UnknownError8发生了某些事情,情况很糟糕。

成员函数文档

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

构造一个具有给定父对象和旧密钥设置为key的共享内存对象。因为它的密钥被设置,所以可以调用它的创建附加函数。

另请参阅 setKey(),create() 以及 attach()。

QSharedMemory::QSharedMemory(QObject *parent = nullptr)

此函数重载了 QSharedMemory()。

使用指定的 parent 构造共享内存对象。由构造函数设置的共享内存对象键不会自动设置,因此该共享内存对象不具有底层共享内存段。在调用 create() 或 attach() 之前,必须使用 setNativeKey() 来设置键。

另请参阅 setNativeKey()。

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

这是一个重载函数。

使用指定的 parent 和键 key 构造共享内存对象。由于其键已设置,因此可以调用其 create() 和 attach() 函数。

另请参阅 setNativeKey(),create() 以及 attach()。

[虚拟 noexcept] QSharedMemory::~QSharedMemory()

析构函数清除键,迫使共享内存对象从其底层共享内存段 detach。如果此共享内存对象是连接到共享内存段的最后一个对象,则 detach() 操作将销毁共享内存段。

另请参阅 detach() 和 isAttached()。

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

尝试将进程附加到使用构造函数或使用 setNativeKey() 调用传递的键标识的共享内存段。默认情况下,访问 modeReadWrite。它也可以是 ReadOnly。如果附加操作成功,则返回 true。如果返回 false,请调用 error() 以确定发生的错误。在附加共享内存段之后,可以通过调用 data() 来获取共享内存的指针。

另请参阅 isAttached(),detach() 以及 create()。

const void *QSharedMemory::constData() const

如果附加了共享内存段,则返回指向该段内容的 const 指针。否则返回 null。此函数返回的值在发生 detach 操作之前不会更改,因此可以安全地存储此指针。

如果内存操作不是原子的,您可以在读取或写入之前使用 lock() 锁定共享内存,但在操作完成后请务必使用 unlock() 释放锁定。

另请参阅 attach() 和 create()。

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

创建具有size字节的共享内存段,使用构造函数传入的键或使用setNativeKey()设置的键,然后使用指定的访问mode附加到新的共享内存段,并返回true。如果通过键标识的共享内存段已存在,则不执行附加操作,并返回false。当返回值是false时,请调用error()以确定错误类型。

另请参阅错误()。

void *QSharedMemory::data()

如果已附加共享内存段,则返回指向共享内存段内容的指针。否则返回null。此函数的返回值将在detach发生之前保持不变,因此可以安全地存储此指针。

如果内存操作不是原子的,您可以在读取或写入之前使用 lock() 锁定共享内存,但在操作完成后请务必使用 unlock() 释放锁定。

另请参阅附加()。

const void *QSharedMemory::data() const

此函数重载data()。

bool QSharedMemory::detach()

从共享内存段断开进程。如果是最后一个附加到共享内存段的进程,则系统将释放共享内存段,即销毁其内容。如果函数断开共享内存段,则返回true。如果返回false,则通常表示段尚未附加或被另一个进程锁定。

另请参阅附加()和isAttached()。

QSharedMemory::SharedMemoryError QSharedMemory::error() const

返回一个值,表示是否发生错误,以及如果有,是哪种错误。

另请参阅错误字符串()。

QString QSharedMemory::errorString() const

返回最后发生错误的文本描述。如果error()返回一个错误值,请调用此函数以获取描述错误的文本字符串。

另请参阅错误()。

QString QSharedMemory::isAttached() const

如果此进程附加到共享内存段,则返回true

另请参阅附加()和断开连接()。

QString QSharedMemory::key() const

返回使用setKey()分配给此共享内存的遗产键,或如果未分配键或段使用nativeKey,则返回一个null键。该键是Qt应用程序用于标识共享内存段的标识符。

您可以通过调用nativeKey()找到操作系统使用的本地(平台特定)键。

另请参阅设置键()和设置本地键()。

bool QSharedMemory::lock()

这是一个用于锁定共享内存段以便该进程访问的信号量,并返回 true。如果另一个进程已锁定该段,本函数会阻塞直到锁被释放。之后,它获得锁并返回 true。如果本函数返回 false,表示您忽略了 create() 或 attach() 的错误返回值,或您通过 setNativeKey() 设置了键,或者因未知系统错误 QSystemSemaphore::acquire() 失败。

另请参阅unlock()、data() 和 QSystemSemaphore::acquire()。

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

返回此共享内存对象的键类型。键类型是操作系统中用于标识共享内存段的标识符,它与 nativeKey() 相辅相成。

您可以使用本地键来访问未由 Qt 创建的共享内存段,或将共享内存访问权限授予非 Qt 应用程序。有关更多信息,请参阅 Native IPC Keys

此函数自 Qt 6.6 版本开始提供。

另请参阅nativeKey() 和 setNativeKey()。

QString QSharedMemory::nativeKey() const

返回此共享内存对象的本地、平台特定的键。本地键是操作系统中用于标识共享内存段的标识符。

您可以使用本地键来访问未由 Qt 创建的共享内存段,或将共享内存访问权限授予非 Qt 应用程序。有关更多信息,请参阅 Native IPC Keys

另请参阅setNativeKey() 和 nativeIpcKey()。

void QSharedMemory::setKey(const QString &key)

这是一个重载函数。

为该共享内存对象设置旧版本的 。如果 与当前键相同,则函数返回并不进行任何操作。否则,如果共享内存对象已附着到底层的共享内存段,它将在设置新键之前从该处分离。此函数不会执行 attach 操作。

您可以通过调用 key() 来检索旧的键。此函数基本上与

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

类似,只不过它允许通过 key() 获取旧的键。

另请参阅key()、nativeKey() 和 isAttached()。

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

为该共享内存对象设置本地、平台特定的 。如果 与当前本地键相同,则函数返回并不进行任何操作。否则,如果共享内存对象已附着到底层的共享内存段,它将在设置新键之前从该处分离。此函数不会执行 attach 操作。

此函数当本地密钥已从其他进程共享时很有用。有关更多信息,请参阅本地 IPC 密钥

可以使用platformSafeKey()函数获取可移植的本地密钥。

您可以通过调用nativeKey()来检索本地密钥。

此函数自 Qt 6.6 版本开始提供。

另请参阅nativeKey()、nativeIpcKey()和isAttached()。

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

设置类型为type的共享内存对象对应的本地、平台特定的key(此类型参数自 Qt 6.6 以来可用)。如果key与当前本地密钥相同,则函数将返回而不执行任何操作。否则,如果共享内存对象连接到底层共享内存段,则在设置新密钥之前,它将断开连接。此函数不执行连接操作。

如果您需要从另一个进程共享本地密钥,此函数很有用,尽管应用程序必须确保密钥类型与另一个进程所期望的类型匹配。有关更多信息,请参阅本地 IPC 密钥

可以使用platformSafeKey()函数获取可移植的本地密钥。

您可以通过调用nativeKey()来检索本地密钥。

另请参阅nativeKey()、nativeIpcKey()和isAttached()。

qsizetype QSharedMemory::size() const

返回已连接的共享内存段的长度。如果没有连接共享内存段,则返回0。

注意:段的长度可能大于传递给create()的请求大小。

另请参阅create()和attach()。

bool QSharedMemory::unlock()

释放共享内存段的锁,并在此进程当前持有锁的情况下返回 true。如果段未锁定或锁定由另一个进程持有,则不会执行任何操作并返回 false。

另请参阅lock()。

© 2024 The Qt Company Ltd. 本文件中的文档贡献属于其各自的所有者。本文件中的文档是根据自由软件基金会发布的GNU 自由文档许可证版本 1.3的条款许可的。Qt和相应的标志是芬兰和/或其他国家的The Qt Company Ltd的商标。所有其他商标均为其各自所有者的财产。