QSharedMemory 類

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 ()
(從 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 提供訪問 共享內存段 通過多綫程和多進程。共享內存段由 Key 標識,錶示通過 QNativeIpcKey 。可以按跨平颱方式創建 Key,通過使用 platformSafeKey()。

每個 QSharedMemory 對象必須 create () 段且這會調用指定段大小。所有其它進程隻需 attach () 到必須已存在的段。2 操作成功後,應用程序可以調用 data () 以獲得數據指針。

為支持非原子操作,QSharedMemory 提供 API 來獲得獨占訪問:可以鎖定共享內存采用 lock () 在讀寫共享內存前,但記住要釋放鎖采用 unlock () 在完成後。

默認情況下,QSharedMemory 會自動銷毀共享內存段,當 QSharedMemory 的最後一個實例 detached 從段,且沒有保留對段的引用。

有關 Key 類型、特定平颱局限性、及與舊 (或非 Qt) 應用程序互操作的細節,見 本機 IPC (進程間通信) 鍵 文檔編製。這包括 Apple 平颱沙盒應用程序的重要信息,包括憑藉 Apple APP 商店獲得的所有應用。

另請參閱 進程間通信 and QSystemSemaphore .

成員類型文檔編製

enum QSharedMemory:: AccessMode

常量 描述
QSharedMemory::ReadOnly 0 共享內存段是隻讀的。不允許寫入共享內存段。嘗試寫入采用 ReadOnly 創建的共享內存段,會導緻程序中止。
QSharedMemory::ReadWrite 1 允許讀寫共享內存段。

enum QSharedMemory:: SharedMemoryError

常量 描述
QSharedMemory::NoError 0 沒有齣現錯誤。
QSharedMemory::PermissionDenied 1 操作失敗,因為調用者沒有所需權限。
QSharedMemory::InvalidSize 2 創建操作失敗,因為請求大小無效。
QSharedMemory::KeyError 3 操作失敗,因為鍵無效。
QSharedMemory::AlreadyExists 4 A create () 操作失敗,因為具有指定鍵的共享內存段已存在。
QSharedMemory::NotFound 5 An attach () 失敗,因為找不到具有指定鍵的共享內存段。
QSharedMemory::LockError 6 試圖 lock () 共享內存段失敗,因為 create () 或 attach () 失敗和返迴 false,或因為發生係統錯誤在 QSystemSemaphore::acquire ().
QSharedMemory::OutOfResources 7 A create () 操作失敗,因為沒有足夠內存可用於填充請求。
QSharedMemory::UnknownError 8 發生其它事情且很糟糕。

成員函數文檔編製

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

構造共享內存對象采用給定 parent 和采用將遺留鍵設為 key 。因為有設置鍵,其 create () 和 attach () 函數可以被調用。

另請參閱 setKey (), create (),和 attach ().

QSharedMemory:: QSharedMemory ( QObject * parent = nullptr)

構造共享內存對象采用給定 parent 。由於構造函數未設置共享內存對象的鍵,因此,共享內存對象沒有附加底層共享內存段。必須設置鍵采用 setNativeKey () 先於 create () 或 attach () 可以使用。

此函數重載 QSharedMemory::QSharedMemory ().

另請參閱 setNativeKey ().

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

構造共享內存對象采用給定 parent 並將其鍵設為 key 。因為有設置鍵,其 create () 和 attach () 函數可以被調用。

這是重載函數。

另請參閱 setNativeKey (), create (),和 attach ().

[virtual noexcept] QSharedMemory:: ~QSharedMemory ()

析構函數清零鍵,強製共享內存對象 detach 從其底層共享內存段。若此共享內存對象是連接到共享內存段的最後一個, detach () 操作會銷毀共享內存段。

另請參閱 detach () 和 isAttached ().

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

試圖將進程附加到共享內存段,通過傳遞給構造函數的鍵標識或調用 setNativeKey ()。訪問 mode is ReadWrite 默認情況下。它還可以為 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 個字節采用傳遞給構造函數的 Key 或設置采用 setNativeKey (),然後附加到新共享內存段采用給定訪問 mode 並返迴 true 。若由鍵標識的共享內存段已存在,不履行附加操作和 false 被返迴。當返迴值為 false ,調用 error () 以確定發生何種錯誤。

另請參閱 error ().

void *QSharedMemory:: data ()

返迴的指針指嚮共享內存段的內容,若有附加的話。否則,返迴 null。由此函數返迴的值不會改變,直到 detach 發生,所以存儲此指針是安全的。

若內存操作不是原子的,可以鎖定共享內存采用 lock () 先於讀寫,但要記得釋放鎖采用 unlock () 在完成後。

另請參閱 attach ().

const void *QSharedMemory:: data () const

此函數重載 QSharedMemory::data ().

bool QSharedMemory:: detach ()

從共享內存段分離進程。若這是附加到共享存儲段的最後進程,則共享存儲段由係統釋放 (即:銷毀內容)。函數返迴 true 若它分離瞭共享內存段。若它返迴 false ,通常意味著段未被附加或被另一進程鎖定。

另請參閱 attach () 和 isAttached ().

QSharedMemory::SharedMemoryError QSharedMemory:: error () const

返迴指示是否發生錯誤的值,且若如此,指示錯誤是什麼。

另請參閱 errorString ().

QString QSharedMemory:: errorString () const

返迴最後發生錯誤的文本描述。若 error () 返迴 錯誤值 ,調用此函數以獲取描述錯誤的文本字符串。

另請參閱 error ().

bool QSharedMemory:: isAttached () const

返迴 true 若此進程被附加到共享內存段。

另請參閱 attach () 和 detach ().

QString QSharedMemory:: key () const

返迴的遺留鍵賦值采用 setKey () 到此共享內存,或 null 鍵若尚未賦值鍵,或段使用的是 nativeKey ()。鍵是 Qt 應用程序用來標識共享內存段的標識符。

可以找到由操作係統使用的本機、特定平颱鍵,通過調用 nativeKey ().

另請參閱 setKey () 和 setNativeKey ().

bool QSharedMemory:: lock ()

這是鎖供此進程訪問的共享內存段的信號量,並返迴 true 。若另一進程已鎖定段,此函數阻塞直到鎖被釋放為止。然後,獲取鎖並返迴 true 。若此函數返迴 false ,意味著已忽略的 false 返迴來自 create () 或 attach (),已設置鍵采用 setNativeKey () 或 QSystemSemaphore::acquire () 失敗由於未知係統錯誤。

另請參閱 unlock (), data (),和 QSystemSemaphore::acquire ().

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

返迴用於此共享內存對象的鍵類型。鍵類型互補 nativeKey () 作為 OS (操作係統) 用來標識共享內存段的標識符。

可以使用本機鍵訪問 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 () 以檢索遺留 Key。此函數主要如同:

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

除瞭使之能夠獲取遺留 Key 使用 key ().

另請參閱 key (), nativeKey (),和 isAttached ().

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

設置特定平颱本機 key 為此共享內存對象。若 key 與當前本機鍵相同,函數返迴不做任何事情。否則,若有附加共享內存對象到底層共享內存段,它將 detach 從其,在設置新鍵之前。此函數不做 attach ().

此函數很有用,若本機鍵共享來自另一進程。見 本機 IPC (進程間通信) 鍵 瞭解更多信息。

使用 platformSafeKey() 可以獲得可移植本機 Key。

可以調用 nativeKey () 來檢索本機鍵。

該函數在 Qt 6.6 引入。

另請參閱 nativeKey (), nativeIpcKey (),和 isAttached ().

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

設置特定平颱本機 key 為此共享內存對象類型 type (type 參數從 Qt 6.6 起可用)。若 key 與當前本機鍵相同,函數返迴不做任何事情。否則,若有附加共享內存對象到底層共享內存段,它將 detach 從其,在設置新鍵之前。此函數不做 attach ().

此函數很有用,若本機鍵共享來自另一進程, 盡管應用程序必須小心確保鍵類型匹配其它進程所期望的。見 本機 IPC (進程間通信) 鍵 瞭解更多信息。

使用 platformSafeKey() 可以獲得可移植本機 Key。

可以調用 nativeKey () 來檢索本機鍵。

另請參閱 nativeKey (), nativeIpcKey (),和 isAttached ().

qsizetype QSharedMemory:: size () const

返迴共享內存段的附加大小。若未附加共享內存段,返迴 0。

注意: 段大小可能大於請求大小,被傳遞給 create ().

另請參閱 create () 和 attach ().

bool QSharedMemory:: unlock ()

釋放共享內存段鎖並返迴 true ,若鎖目前由此進程保持。若段未被鎖定,或鎖由另一進程所保持,則什麼也不會發生並返迴 false。

另請參閱 lock ().