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