alin的學習之路 共享記憶體

2021-10-24 01:47:05 字數 2907 閱讀 4500

共享記憶體是程序間通訊中效率最高的一種方式。

共享記憶體的作用:

訊號 ->不推薦使用套接字

共享記憶體是迄今為止接觸的程序間通訊中效率最高的一種

基於乙個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 ...