IPC之共享記憶體

2021-07-14 22:53:14 字數 1338 閱讀 3388

標頭檔案: sys/shm.h

ipcs  -m #檢視共享記憶體狀況

1、共享記憶體的建立

shmget 函式

同一段記憶體被不同程序共享

但是共享記憶體並不提供同步機制

需要訊號量等加以輔助

int shmget(key_t key, size_t size,int shm***)

@key ipc_private 只屬於建立程序   一般不會用 用的是(key_t)1234   不同的程序使用同乙個key來連線同乙個共享記憶體

@size 記憶體容量大小

@shm***  檔案開啟許可權mode

0666|ipc_creat

不相關的程序可以通過該函式的返回值訪問同一共享記憶體

2、shmat函式

第一次建立完共享記憶體時,它還不能被任何程序訪問,shmat函式的作用就是用來啟動對該共享記憶體的訪問

並把共享記憶體連線到當前程序的位址空間

void * shmat(int shm_id, const void *shm_addr,int shm***)

@shm_id 是由shmget返回的共享記憶體標識

@shm_addr 指定共享記憶體連線到當前程序中的位址位置,通常為空,表示讓系統來選擇共享記憶體的位址

@shm*** 一組標誌位,通常為0

呼叫成功時,返回乙個指向共享記憶體第乙個位元組的指標,如果呼叫失敗返回-1

3、shmdt函式

該函式用於將共享記憶體從當前程序中分離。注意,將共享記憶體分離,並不是刪除它,而是當前程序不能再使用該共享記憶體

int shmdt(const void *shmaddr)

引數shmaddr是shmat函式返回的位址指標,呼叫成功時返回0,失敗返回-1

4、shmctl函式

與訊號量的semctl函式一樣,用來控制共享記憶體

int shmctl(int shm_id,int cmd,struct shmid_ds *buf)

第乙個引數 shm_id是shnmget函式返回的共享記憶體標識

第二個引數 cmd是要採用的操作,可以取下面三個值:

ipc_stat   把shmid_ds 結構中的資料設定為共享記憶體的當前關聯值,即用共享記憶體的當前關聯值覆蓋shmid_ds的值

ipc_set    如果程序有足夠的許可權,就把共享記憶體的當前關聯值設定為shmid_ds結構中給出的值

ipc_rmid   刪除共享記憶體段

第三個引數 buf是乙個結構指標,它指向共享記憶體模式和訪問許可權的結構

shmid_ds結構至少包括以下成員

struct shmid_ds

;5、使用共享記憶體進行程序間通訊

生產者消費者案例

IPC之共享記憶體(2)

在記憶體對映檔案中給計數器持續加1 本程式的目的是使父子程序之間共享存放著計數器的乙個記憶體區 int main exit 0 for i 0 i nloop i exit 0 共享乙個記憶體區和乙個訊號量的父子程序 父程序在呼叫fork之前建立的記憶體對映關係由父子程序之間共享。我們在開啟檔案以後...

IPC通訊之共享記憶體

共享記憶體就是使得多個程序可以訪問同一塊記憶體空間,是最快的可用 ipc形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。我們通過一張圖來表示這個關係 共享記憶體和訊息佇列,訊號量一樣都屬於xsi ipc。核心都為他們維護了一套資料結構 同...

IPC 共享記憶體

共享記憶體 shared memory 是最簡單的程序間通訊方式,它允許多個程序訪問相同的記憶體,乙個程序改變其中的資料後,其他的程序都可以看到資料的變化。共享記憶體是程序間最快速的通訊方式 程序共享同一塊記憶體空間。訪問共享記憶體和訪問私有記憶體一樣快。不需要系統呼叫和核心入口。不造成不必要的記憶...