共享記憶體是程序間通訊中效率最高的一種方式。
共享記憶體的作用:
訊號 ->不推薦使用
套接字
共享記憶體是迄今為止接觸的程序間通訊中效率最高的一種
基於乙個key來建立共享記憶體,在linux下 key是乙個整數,在windows下 key是乙個字串。建立出來的共享記憶體不屬於任何程序,屬於核心
如果某個程序想要使用這塊記憶體,需要與這塊記憶體進行關聯
如果關聯成功,則會獲得共享的起始位址,根據這個位址讀/寫資料
讀寫資料前需要加鎖,結束後需要解鎖
如果不需要再使用這塊共享記憶體了,可以和共享記憶體解除關聯
通過已經建立好了的共享記憶體的key來開啟這塊記憶體
和共享記憶體進行關聯
基於起始位址讀寫記憶體
和共享記憶體解除關聯
下邊的是qt將系統的共享記憶體api封裝之後的得到的類
// 建構函式
qsharedmemory::qsharedmemory(const qstring &key, qobject *parent = q_nullptr);
引數: - key: 共享記憶體的唯一標識, 通過這個key來建立/查詢共享記憶體
- parent: 指定父物件
qsharedmemory::qsharedmemory(qobject *parent = q_nullptr);
// 給共享記憶體物件指定 key 值
void qsharedmemory::setkey(const qstring &key);
// 建立共享記憶體, 建立成功之後, 程序就自動和共享記憶體關聯到一起了
// 如果基於某個key的共享記憶體已經存在了, 再呼叫create函式, 返回false
bool qsharedmemory::create(int size, accessmode mode = readwrite);
引數: - size: 共享記憶體的大小, 單位: 位元組
- mode: 對共享記憶體的訪問許可權, 預設是讀寫
- qsharedmemory::readonly
- qsharedmemory::readwrite
返回值:
- 成功: true
- 失敗: false
// 和共享記憶體進行關聯
// 關聯成功之後, 預設的訪問許可權也是讀寫
bool qsharedmemory::attach(accessmode mode = readwrite);
引數: - mode: 對共享記憶體的訪問許可權, 預設是讀寫
- qsharedmemory::readonly
- qsharedmemory::readwrite
返回值:
- 成功: true
- 失敗: false
// 判斷當前程序是否和共享記憶體關聯到一起了
bool qsharedmemory::isattached() const;
返回值:
- 已經關聯了: true
- 沒有關聯: false
// 得到共享的起始位址, 必須要關聯成功
// 如果程序沒有和共享記憶體進行關聯, 呼叫這個函式返回null
void *qsharedmemory::data(); // -- 用的比較多, 預設情況下對共享記憶體的許可權是: 讀寫
const void *qsharedmemory::data() const;
const void *qsharedmemory::constdata() const;
// 對共享記憶體加鎖
bool qsharedmemory::lock();
// 對共享記憶體解鎖
bool qsharedmemory::unlock();
// 和共享記憶體解除關聯
bool qsharedmemory::detach();
// 列印共享記憶體操作失敗的原因
qstring qsharedmemory::errorstring() const;
// 得到共享記憶體物件關聯 key 字串
qstring qsharedmemory::key() const;
// 得到關聯的共享記憶體的大小
int qsharedmemory::size() const;
返回值:
- 如果成功關聯了共享記憶體: 共享記憶體的大小
- 沒有關聯共享記憶體: 0
struct person
;
readshm
qsharedmemory* shm = new qsharedmemory(this);
shm->setkey("123456");
shm->attach();
shm->lock();
person* paddr = (person*)shm->data();
qdebug() << "num = " << paddr->num
<< "name = " << paddr->name;
shm->unlock();
shm->detach();
writeshm
qsharedmemory* shm = new qsharedmemory("123456");
shm->create(1024);
bool bl = shm->create(1024);
if(!bl)
person* paddr = (person*)shm->data();
shm->lock();
paddr->num = 100;
strcpy(paddr->name, "alin");
shm->unlock();
共享記憶體學習
1 建立獲取共享記憶體 1.1標頭檔案 include include 1.2功能描述 建立或者獲取共享記憶體並返回描述符。1.3 函式原型 int shmget key t key,size t size,int shm 1.4 返回值 成功 返回建立或者獲取到的共享記憶體的描述符。失敗 1 1....
alin的學習之路 面試題 計算機網路相關
reactor的組成 time wait危害 time wait時長,為什麼?ip為什麼要分片 專案中說用到執行緒池,開多大,為什麼運用執行緒池?select和epoll區別 epoll select什麼情況返回0 epoll可讀情況有哪些 什麼時候需要tcp四次揮手?如何設定非阻塞 什麼是零拷貝?...
共享記憶體IPC入門學習
系統建立ipc通訊 如訊息佇列 共享記憶體時 必須指定乙個id值。通常情況下,該id值通過ftok函式得到。ftok原型如下 key t ftok char fname,int id fname就時你指定的檔名 該檔案必須是存在而且可以訪問的 id是子序號,雖然為int,但是只有8個位元被使用 0 ...