1. 程式人生 > >Linux學習日誌--共享記憶體

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