共享記憶體可以說是最有用的程序間通訊方式,也是最快的ipc形式。兩個不同程序a、b共享記憶體的意思是,同一塊物理記憶體被對映到程序a、b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和訊號量都可以。
1. 建立共享記憶體(開啟)
#include
#include
int shmget(key_t key,size_t size,int shm***>;
key(非0整數):為共享記憶體段命名,shmget成功時返回乙個與key相關的記憶體識別符號shm_id(非負整數),失敗時返回-1
size:以位元組為單位指定需要共享的記憶體容量
shm***:許可權標誌,與open函式的mode引數一樣,建立共享記憶體時此引數位可寫成
ipc_creat | 0666
2.啟動程序對共享記憶體的訪問(對映)
第一次建立完共享記憶體時,它還不能被任何程序訪問,shmat函式的作用就是用來啟動對該共享記憶體的訪問,並把共享記憶體連線到當前程序的位址空間。
#include
#include
void *shmat(int shm_id, const
void *shm_addr, int shm***);
shm_id: 是由shmget 函式返回的共享記憶體標識。
shm_addr:指定共享記憶體連線到當前程序的位址位置,通常為空,表示讓系統來選擇共享記憶體的位址。
shm_***:是一組標誌位,通常為0。
shmat 呼叫成功後返回乙個指向共享記憶體第乙個位元組的指標,呼叫失敗返回-1。
3、分離共享記憶體(解除對映)
shmdt函式用於將共享記憶體從當前程序中分離。注意,將共享記憶體分離並不是刪除它,只是使該共享記憶體對當前程序不再可用。
#include
#include
int shmdt(const
void *shmaddr);
shmaddr:是shmat函式返回的位址指標
呼叫成功返回0,失敗返回-1。
4、控制共享記憶體(控制)
#include
#include
int shmctl(int shm_id, int command, struct shmid_ds *buf);
shm_id:是shmget函式返回的共享記憶體識別符號
command: 控制共享記憶體要採取的操作,可以取以下三個值:
ipc_stat : 把shmid_ds結構體中的資料設定為共享記憶體的當前關聯值,即用共享記憶體的當前關聯值覆蓋shmid_ds的值
ipc_set : 如果程序有足夠的許可權,就把共享記憶體當前的關聯值設定為shmid_ds結構體中給出的值
ipc_rmid : 刪除共享記憶體段
buf : 是乙個結構體指標,指向共享記憶體模式和訪問許可權的結構體
shmid_ds結構體的成員至少包括:
struct shmid_ds
;
呼叫成功返回0,失敗返回-1
一般對記憶體區域的操作是先開啟-》對映-》(操作)-》(控制)-》解除對映。
shm.h
#ifndef _shm_
#define _shm_
#include
#include
#include
#include
#include
#define _path_ "."
#define _project_ 8888
#define _shm_size_ 4*1024
int get_shm();
char *at_shm();
int delete_shm();
int rm_shm();
#endif
shm.c
#include "shm.h"
int get_shm()
else
return shm_id;
}char *at_shm(int shm_id)
int delete_shm(char* addr)
int rm_shm(int shm_id)
int main()
else
if(id==0)
buf[4096]= '\0';
delete_shm(buf);
}else
return
0;}
IPC 共享記憶體
共享記憶體 shared memory 是最簡單的程序間通訊方式,它允許多個程序訪問相同的記憶體,乙個程序改變其中的資料後,其他的程序都可以看到資料的變化。共享記憶體是程序間最快速的通訊方式 程序共享同一塊記憶體空間。訪問共享記憶體和訪問私有記憶體一樣快。不需要系統呼叫和核心入口。不造成不必要的記憶...
IPC 共享記憶體
a 意義 多個程序共享一部分物理記憶體。訪問快,方便 b 先建立共享記憶體 int shmget key t key,int size,int shm 1.key 標誌共享記憶體的鍵值 0 ipc private a key 0 a 意義 多個程序共享一部分物理記憶體。訪問快,方便 b 先建立共享記...
IPC 共享記憶體
程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址。共享記憶體並未提供同步機制,使用訊號量進行同步。共享記憶體的特點 1 共享記憶體是程序間共享資料的一種最快的方法。乙個程序向共享的記憶體區域寫入了資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。2...