QSharedMemory 类
QSharedMemory 类提供了对共享内存段的访问。 更多信息...
头文件 | #include <QSharedMemory> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += 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() |
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() |
(自 6.6) QNativeIpcKey | nativeIpcKey() const |
QString | nativeKey() const |
void | setKey(const QString &key) |
(自 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对象必须创建()段并指定段的长度。所有其他进程只需附加()到已存在的段上。在任一操作成功后,应用程序可以调用data()以获取数据指针。
为了支持非原子操作,QSharedMemory提供了获取独占访问的API:在从或向共享内存读取或写入之前,你可以使用lock()锁定共享内存,但完成后记得使用unlock()解锁。
默认情况下,当最后一个QSharedMemory实例从段中分离且没有段引用时,QSharedMemory将自动销毁共享内存段。
有关键类型、平台特定的限制以及与较旧或非Qt应用程序的互操作性的详细信息,请参阅本地IPC密钥文档。其中包括适用于Apple平台沙箱应用程序的重要信息,包括通过Apple应用商店获取的所有应用程序。
另请参阅进程间通信和QSystemSemaphore。
成员类型文档
枚举 QSharedMemory::AccessMode
常数 | 值 | 描述 |
---|---|---|
QSharedMemory::ReadOnly | 0 | 共享内存段为只读。不允许向共享内存段写入。使用ReadOnly创建共享内存段时尝试写入会导致程序中止。 |
QSharedMemory::ReadWrite | 1 | 允许读取和写入共享内存段。 |
枚举 QSharedMemory::SharedMemoryError
常数 | 值 | 描述 |
---|---|---|
QSharedMemory::NoError | 0 | 没有错误发生。 |
QSharedMemory::PermissionDenied | 1 | 由于调用者没有所需的权限,操作失败。 |
QSharedMemory::InvalidSize | 2 | 由于请求的大小无效,创建操作失败。 |
QSharedMemory::KeyError | 3 | 由于密钥无效,操作失败。 |
QSharedMemory::AlreadyExists | 4 | 由于指定的键的共享内存段已存在,创造操作失败。 |
QSharedMemory::NotFound | 5 | 由于无法找到指定的键的共享内存段,附加操作失败。 |
QSharedMemory::LockError | 6 | 尝试锁定共享内存段失败,因为创造或附加失败并返回了false,或者因为在QSystemSemaphore::acquire()中发生了系统错误。 |
QSharedMemory::OutOfResources | 7 | 由于没有足够的内存来填充请求,创造操作失败。 |
QSharedMemory::UnknownError | 8 | 发生了某些事情,情况很糟糕。 |
成员函数文档
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() 调用传递的键标识的共享内存段。默认情况下,访问 mode 是 ReadWrite。它也可以是 ReadOnly。如果附加操作成功,则返回 true
。如果返回 false,请调用 error() 以确定发生的错误。在附加共享内存段之后,可以通过调用 data() 来获取共享内存的指针。
另请参阅 isAttached(),detach() 以及 create()。
const void *QSharedMemory::constData() const
如果附加了共享内存段,则返回指向该段内容的 const 指针。否则返回 null。此函数返回的值在发生 detach 操作之前不会更改,因此可以安全地存储此指针。
如果内存操作不是原子的,您可以在读取或写入之前使用 lock() 锁定共享内存,但在操作完成后请务必使用 unlock() 释放锁定。
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()的请求大小。
bool QSharedMemory::unlock()
释放共享内存段的锁,并在此进程当前持有锁的情况下返回 true。如果段未锁定或锁定由另一个进程持有,则不会执行任何操作并返回 false。
另请参阅lock()。
© 2024 The Qt Company Ltd. 本文件中的文档贡献属于其各自的所有者。本文件中的文档是根据自由软件基金会发布的GNU 自由文档许可证版本 1.3的条款许可的。Qt和相应的标志是芬兰和/或其他国家的The Qt Company Ltd的商标。所有其他商标均为其各自所有者的财产。