QSharedMemory Class

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

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

公共类型

enum AccessMode { ReadOnly, ReadWrite }
enum 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)
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()

详细说明

QSharedMemory 允许多个线程和进程访问共享内存段。共享内存段由一个密钥标识,密钥用QNativeIpcKey 表示。可使用 platformSafeKey() 以跨平台方式创建键。

一个 QSharedMemory 对象必须create() 该段,该调用指定了该段的大小。所有其他进程只需attach() 到必须已经存在的段。任一操作成功后,应用程序可调用data() 获取数据指针。

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

默认情况下,当 QSharedMemory 的最后一个实例从共享内存段中detached 时,QSharedMemory 会自动销毁共享内存段,并且不会保留对该段的引用。

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

另请参阅 进程间通信QSystemSemaphore

成员类型文档

enum QSharedMemory::AccessMode

常数说明
QSharedMemory::ReadOnly0共享内存段为只读。不允许写入共享内存段。尝试写入以只读方式创建的共享内存段会导致程序中止。
QSharedMemory::ReadWrite1读取和写入共享内存段都是允许的。

enum QSharedMemory::SharedMemoryError

常数说明
QSharedMemory::NoError0未发生错误。
QSharedMemory::PermissionDenied1操作失败是因为调用者没有所需的权限。
QSharedMemory::InvalidSize2创建操作失败,因为请求的大小无效。
QSharedMemory::KeyError3操作失败的原因是键无效。
QSharedMemory::AlreadyExists4create() 操作失败,因为指定键的共享内存段已经存在。
QSharedMemory::NotFound5attach() 操作失败,因为找不到具有指定密钥的共享内存段。
QSharedMemory::LockError6尝试lock() 共享内存段失败,因为create() 或attach() 失败并返回 false,或者因为QSystemSemaphore::acquire() 中发生系统错误。
QSharedMemory::OutOfResources7create() 操作失败是因为没有足够的内存来满足请求。
QSharedMemory::UnknownError8发生了其他错误。

成员函数文档

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

用给定的parent 构建一个共享内存对象,其传统密钥设置为key 。由于其密钥已设置,因此可以调用create() 和attach() 函数。

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

QSharedMemory::QSharedMemory(QObject *parent = nullptr)

该函数重载了 QSharedMemory()。

用给定的parent 构造一个共享内存对象。构造函数没有设置共享内存对象的键,因此共享内存对象没有附加底层共享内存段。在使用create() 或attach() 之前,必须使用setNativeKey() 设置键。

另请参见 setNativeKey()。

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

这是一个重载函数。

用给定的parent 构建一个共享内存对象,其 key 设置为key 。由于其 key 已设置,因此可以调用create() 和attach() 函数。

另请参见 setNativeKey()、create() 和attach()。

[virtual noexcept] QSharedMemory::~QSharedMemory()

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

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

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

试图将进程附加到共享内存段,该共享内存段由传递给构造函数或调用setNativeKey() 时所传递的密钥标识。访问mode 的默认值是ReadWrite 。也可以是ReadOnly 。如果附加操作成功,则返回true 。如果返回 false,则调用error() 来确定发生的错误。附加共享内存段后,可通过调用data() 获得共享内存的指针。

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

const void *QSharedMemory::constData() const

如果已连接共享内存段,则返回指向共享内存段内容的常量指针。否则返回空值。在detach 发生之前,该函数返回的值不会改变,因此存储该指针是安全的。

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

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

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

使用传递给构造函数的密钥或通过setNativeKey() 设置的密钥创建一个size 字节的共享内存段,然后使用给定的访问mode 附加到新的共享内存段,并返回true 。如果键所标识的共享内存段已经存在,则不执行附加操作,并返回false 。当返回值为false 时,调用error() 来确定发生的错误。

另请参阅 error() 。

void *QSharedMemory::data()

如果已连接共享内存段,则返回指向共享内存段内容的指针。否则返回空值。在detach 发生之前,该函数返回的值不会改变,因此存储该指针是安全的。

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

另请参阅 attach()。

const void *QSharedMemory::data() const

此函数重载 data()。

bool QSharedMemory::detach()

将进程从共享内存段中分离。如果这是最后一个连接到共享内存段的进程,那么系统将释放共享内存段,即销毁其中的内容。如果函数脱离了共享内存段,则返回true 。如果返回false ,通常意味着该内存段要么没有连接,要么被其他进程锁定。

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

QSharedMemory::SharedMemoryError QSharedMemory::error() const

返回一个值,说明是否发生错误,如果发生错误,则说明是哪个错误。

另请参见 errorString()。

QString QSharedMemory::errorString() const

返回上次出错的文本描述。如果error() 返回error value ,则调用此函数获取描述错误的文本字符串。

另请参阅 error()。

bool QSharedMemory::isAttached() const

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

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

QString QSharedMemory::key() const

返回通过setKey() 分配给此共享内存的传统密钥,如果没有分配密钥,或者段使用了nativeKey() 则返回空密钥。键是 Qt 应用程序用来识别共享内存段的标识符。

您可以调用nativeKey() 查找操作系统使用的本地特定平台密钥。

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

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 应用程序共享内存访问权限。更多信息,请参阅本地 IPC 密钥

此功能在 Qt 6.6 中引入。

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

QString QSharedMemory::nativeKey() const

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

您可以使用本地密钥访问 Qt 未创建的共享内存段,或授予非 Qt 应用程序共享内存访问权限。更多信息,请参阅本地 IPC 密钥

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

void QSharedMemory::setKey(const QString &key)

这是一个重载函数。

设置此共享内存对象的传统key 。如果key 与当前键值相同,则函数返回,不做任何操作。否则,如果共享内存对象连接到底层共享内存段,则会在设置新键前从该共享内存段detach 。该函数不会执行attach() 操作。

您可以调用key() 来获取传统密钥。该函数与

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

除了可以使用key() 获取传统密钥。

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

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

为该共享内存对象设置本地、特定平台的key 。如果key 与当前本地密钥相同,函数将返回而不做任何操作。否则,如果共享内存对象连接到底层共享内存段,则会在设置新键前从该共享内存段detach 。该函数不会执行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 与当前本地键相同,则函数返回,不做任何操作。否则,如果共享内存对象连接到底层共享内存段,则会在设置新键之前从该共享内存段detach 。该函数不会执行attach() 操作。

如果本地密钥是从其他进程共享过来的,那么这个函数就很有用,不过应用程序必须注意确保密钥类型符合其他进程的期望。更多信息,请参阅本地 IPC 密钥

可移植本地密钥可使用 platformSafeKey() 获取。

可以调用nativeKey() 获取本地密钥。

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

qsizetype QSharedMemory::size() const

返回所连接的共享内存段的大小。如果没有附加共享内存段,则返回 0。

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

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

bool QSharedMemory::unlock()

释放共享内存段上的锁,如果锁当前由本进程持有,则返回true 。如果未锁定内存段,或锁被其他进程持有,则不会发生任何操作,并返回 false。

另请参阅 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.