class QSharedMemory#

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

Inheritance diagram of PySide6.QtCore.QSharedMemory

摘要#

方法#

静态函数#

注意

该文档可能包含从 C++ 自动转换为 Python 的代码片段。我们始终欢迎对片段翻译的贡献。如果您发现翻译有问题,您也可以通过在 https:/bugreports.qt.io/projects/PYSIDE 上创建工单来通知我们

详细说明#

QSharedMemory 通过多个线程和进程提供了访问 共享内存段 的功能。共享内存段通过 QNativeIpcKey 表示的键来识别。可以通过使用 platformSafeKey() 以跨平台方式创建键。

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

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

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

有关密钥类型、平台特定限制以及与旧版或非Qt应用程序的互操作性的详细信息,请参阅本地IPC密钥文档。这包括适用于Apple平台沙盒应用的 重要信息,包括通过Apple App Store获得的所有应用。

class AccessMode#

常量

描述

QSharedMemoryReadOnly

共享内存段为只读。不允许写入共享内存段。尝试使用ReadOnly创建的共享内存段写入将导致程序终止。

QSharedMemoryReadWrite

允许读取和写入共享内存段。

class SharedMemoryError#

常量

描述

QSharedMemoryNoError

没有出现错误。

QSharedMemoryPermissionDenied

操作失败,因为调用者没有所需权限。

QSharedMemoryInvalidSize

创建操作失败,因为请求的大小无效。

QSharedMemoryKeyError

操作失败,因为键无效。

QSharedMemoryAlreadyExists

创建操作失败,因为在指定的键上已经存在共享内存段。

QSharedMemoryNotFound

附加操作失败,因为指定的键找不到共享内存段。

QSharedMemoryLockError

尝试锁定共享内存段失败,因为创建或附加失败并返回了false,或因为acquire()中发生了系统错误。

QSharedMemoryOutOfResources

创建操作失败,因为没有足够的内存来填充请求。

QSharedMemory未知错误

发生了一些事情,情况很糟糕。

__init__(key[, parent=None])
参数:

这是一个重载函数。

使用指定的 parent 和密钥 key 构造一个共享内存对象。因为其密钥已设置,可以调用其 create()attach() 函数。

__init__(key[, parent=None])
参数:

使用指定的 parent 和遗留密钥 key 构造一个共享内存对象。因为其密钥已设置,可以调用其 create()attach() 函数。

另请参阅

setKey() create() attach()

__init__([parent=None])
参数:

parentQObject

此函数重载了 QSharedMemory()

使用给定的 parent 构造共享内存对象。共享内存对象的密钥不是由构造函数设置的,因此共享内存对象没有附加底层共享内存段。在使用 setNativeKey() 方法设置密钥之前,不能使用 create()attach() 方法。

另请参阅

setNativeKey()

attach([mode=QSharedMemory.AccessMode.ReadWrite])#
参数:

modeAccessMode

返回类型:

bool

尝试将进程附加到由构造函数或 setNativeKey() 调用提供的密钥标识的共享内存段。默认访问 modeReadWrite。它也可以是 ReadOnly。如果附加操作成功,则返回 true。如果返回 false,调用 error() 方法以确定发生的错误。在附加共享内存段后,可以通过调用 data() 获取共享内存的指针。

constData()#
返回类型:

void

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

如果内存操作不是原子的,请在读取或写入之前使用 lock() 锁定共享内存,但请记住使用 unlock() 释放锁。

另请参阅

attach() create()

create(size[, mode=QSharedMemory.AccessMode.ReadWrite])#
参数:
返回类型:

bool

创建一个大小为 size 字节的共享内存段,使用构建函数的键或使用 setNativeKey() 设置的键,然后以给定的访问 mode 连接到新的共享内存段并返回 true。如果以该键标识的共享内存段已存在,则不执行附加操作并返回 false。当返回值为 false 时,调用 error() 确定发生哪个错误。

另请参阅

error()

detach()#
返回类型:

bool

从共享内存段断开进程。如果是最后一个连接到共享内存段的进程,则系统将释放共享内存段,即销毁其内容。如果成功断开共享内存段,函数返回 true。如果返回 false,通常意味着段未附加,或者被其他进程锁定。

另请参阅

attach() isAttached()

error()#
返回类型:

SharedMemoryError

返回一个值,表示是否发生错误,如果发生了错误,指出是哪个错误。

另请参阅

errorString()

errorString()#
返回类型:

str

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

另请参阅

error()

isAttached()
返回类型:

bool

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

另请参阅

attach() detach()

static isKeyTypeSupported(type)
参数:

typeType

返回类型:

bool

key()
返回类型:

str

返回分配给此共享内存的旧式密钥(通过 setKey() 方法设置),如果没有分配密钥或段使用 nativeKey(),则返回 null 密钥。密钥是 Qt 应用程序用于识别共享内存段的标识符。

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

另请参阅

setKey() setNativeKey()

static legacyNativeKey(key[, type=QNativeIpcKey.legacyDefaultTypeForOs()])
参数:
  • key – str

  • typeType

返回类型:

QNativeIpcKey

lock()
返回类型:

bool

这是一个信号量,用于锁定该进程对共享内存段的访问,并返回 true。如果另一个进程已经锁定了该段,则该函数将阻塞,直到锁定被释放。然后它获取锁定并返回 true。如果该函数返回 false,表示你忽略了来自 create()attach() 的错误,或者使用 setNativeKey() 设置了密钥,或者因为未知系统错误而失败。

另请参阅

unlock() data() acquire()

nativeIpcKey()#
返回类型:

QNativeIpcKey

返回该共享内存对象的密钥类型。密钥类型与 nativeKey() 相辅相成,作为操作系统用于标识共享内存段标识符。

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

nativeKey()#
返回类型:

str

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

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

static platformSafeKey(key[, type=QNativeIpcKey.DefaultTypeForOs])#
参数:
  • key – str

  • typeType

返回类型:

QNativeIpcKey

setKey(key)#
参数:

key – str

这是一个重载函数。

设置该共享内存对象的旧版 key。如果 key 与当前 key 相同,函数将返回而不执行任何操作。否则,如果共享内存对象附加到底层共享内存段,它将在新 key 设置之前 detach 从它。此函数不会执行 attach()

您可以调用 key() 来检索旧版 key。此功能大致与以下代码一样:

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

除了它启用使用 key() 获取旧版 key。

setNativeKey(key)#
参数:

keyQNativeIpcKey

设置此共享内存对象的本地、平台特定的 key。如果 key 与当前本地 key 相同,函数将返回而不执行任何操作。如果共享内存对象已附加到底层共享内存段,它将在新 key 设置之前 detach 从它。此函数不会执行 attach()

如果本地 key 来自其他进程,则此函数很有用。有关更多信息,请参阅 本地 IPC Keys

可以使用 platformSafeKey() 获取可移植的本地键。

可以通过调用 nativeKey() 来检索本地 key。

setNativeKey(key)#
参数:
  • key – str

  • typeType

为该类型为 type 的共享内存对象设置本机、平台特定的 key(类型参数自 Qt 6.6 起可用)。如果 key 与当前的本机密钥相同,则该函数返回而不做任何操作。否则,如果共享内存对象连接到底层共享内存段,则设置新密钥前将使用 detach 从该段中分离出来。此函数不执行 attach()

如果原生密钥是从另一个进程中共享的,则此函数很有用,尽管应用程序必须确保密钥类型与另一个进程期望的类型匹配。有关更多信息,请参阅 Native IPC Keys

可以使用 platformSafeKey() 获取可移植的本地键。

可以通过调用 nativeKey() 来检索本地 key。

size()#
返回类型:

int

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

注意

段的尺寸可能大于传递给 create() 的请求大小。

另请参阅

create()attach()

unlock()#
返回类型:

bool

释放共享内存段上的锁并返回 true,如果当前该进程正在持有此锁。如果段未锁定或由另一个进程持有锁,则该函数不做任何操作,并返回 false

另请参阅

lock()