Linux學習日誌--共享記憶體
一:什麼是共享記憶體
共享記憶體是屬於IPC(Inter-Process Communication程序間通訊)機制,其他兩種是訊號量和訊息佇列,該機制為程序開闢建立了特殊的地址範圍,就像malloc分配那樣。程序可以將同一段共享記憶體連線到自己的地址空間上,從而操作共享記憶體,所以說,共享記憶體提供了多個程序之間共享和傳遞資料一種方式。需要注意的是:該機制沒有提供同步機制,所以我們需要採取有效的機制來同步對共享記憶體的訪問。
二:共享記憶體的原理圖
三: 相關的函式
標頭檔案:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
建立或開啟函式:
int shmget(key_t key, int size, int shmflg);
引數:第一個key是程式提供的,用於給共享記憶體命名。如果該命名的共享記憶體已經開啟,則直接返回該記憶體標識。
第二個sie是規定記憶體的大小。
第三個是掩碼合成值。包括許可權值和IPC_CREAT或IPC_EXCL。例如:0600|IPC_CREAT 代表可讀寫並且如果該記憶體不存在,就建立一個。
返回:呼叫成功,返回記憶體標識。失敗,返回-1.
連線函式:
void *shmat(int shmid, const void *shmaddr, int shmflg);
作用://對映程序和共享記憶體的地址空間
引數:
第一個shmid是建立函式返回標識。
第二個shmaddr 是共享記憶體在程序的地址位置。通常為NULL,讓系統預設。
第三個shmflg是位標識。通常為0
返回:呼叫成功,返回指向共享記憶體第一個位元組的指標。失敗,返回-1;
分離函式:
int shmdt(const void *shmaddr);//用於分離程序空間和共享記憶體段
返回:呼叫成功,返回0 失敗,返回-1;
刪除共享記憶體段函式:
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
引數:
第一個shmid是建立函式返回標識。
第二個cmd 是對共享記憶體操作。 通常為IPC_RMID 代表刪除。
第三個通常為NULL