學習筆記之共享記憶體

2021-09-25 23:56:36 字數 1818 閱讀 7499

共享記憶體

共享記憶體是程序間通訊方式中效率最高的一種,因為程序可以對記憶體進行直接讀寫,而沒有複製等其他操作,共享記憶體在核心中被建立,用時對映在使用者空間,在使用者空間操作。由於多個程序可同時訪問共享記憶體,因此需要同步和互斥機制配合使用

一、函式介面

申請key值,除建立共享記憶體以外的程序需要通過key值來獲得記憶體的id值,當key值為ipc_private(0)時,共享記憶體為私有,只有當前程序可以訪問。

1、key_t ftok(const char *path, int proj_id);

成功時返回合法的key值,失敗時返回eof

path 存在且可訪問的檔案的路徑

proj_id 用於生成key的數字,不能為0

2、 建立或者開啟乙個共享記憶體

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

成功時返回共享記憶體的id,失敗時返回eof

key 和共享記憶體關聯的key,ipc_private 或 ftok生成

shm*** 共享記憶體標誌位 ipc_creat|0666

3、共享記憶體對映

void *shmat(int shmid, const void *shmaddr, int shm***);

成功時返回對映後的位址,失敗時返回(void *)-1

shmid 要對映的共享記憶體id

shmaddr 對映後的位址, null表示由系統自動對映

shm*** 標誌位 0表示可讀寫;shm_rdonly表示唯讀

4、取消對映

int shmdt(void *shmaddr);

成功時返回0,失敗時返回eof

不使用共享記憶體時應撤銷對映

程序結束時自動撤銷

5、共享記憶體控制

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

成功時返回0,失敗時返回eof

shmid 要操作的共享記憶體的id

cmd 要執行的操作 ipc_stat ipc_set ipc_rmid

buf 儲存或設定共享記憶體屬性的位址

ipc_stat為獲取共享記憶體的屬性,如記憶體的大小,關聯的ley值等

ipc_rmid為刪除共享記憶體,此時函式第三個函式為null

二、檢視ipc物件的命令

1、ipcs

檢視共享資訊的記憶體的命令,缺省會列出共享記憶體、訊號量,佇列資訊,-m列出共享記憶體,-s列出共享訊號量,-q列出共享佇列; ipcs -a檢視所有的ipc物件使用情況

2、ipcrm 刪除乙個ipc物件

ipcrm -m id 刪除共享記憶體

ipcem -s id 刪除訊號量

ipcrm -q id 刪除訊息佇列

三、注意

通過ipcs -l可知如下,共享記憶體最大個數為4096個,每個最大為32k,…

共享記憶體刪除的時間點

shmctl(shmid, ipc_rmid, null) 新增刪除標記

當所有程序對映取消且共享記憶體被新增刪除標記,共享記憶體才會被真正刪除。

nattach (程序取消對映的值)變成0時真正刪除

Linux學習筆記之共享記憶體

共享記憶體物件 shm 操作框架 key值 申請物件 掛載物件 讀寫物件 解除安裝物件 刪除物件 shmget shmat 記憶體讀寫 shmdt shmctl 1 申請物件 include include int shmget key t key,size t size,int shm 功能 該函...

linux筆記之共享記憶體

1.程序間通訊的三種方法 2.共享記憶體的優點 執行時省去了若干次拷貝,是以上三種程式間通訊中最快的 3.共享記憶體的缺點 訊息佇列 管道等自帶同步或互斥機制,而共享記憶體不自帶,故需要使用訊號量來實現共享記憶體的互斥和同步。1.建立共享記憶體 int creat shm int size 建立 呼...

共享記憶體學習

1 建立獲取共享記憶體 1.1標頭檔案 include include 1.2功能描述 建立或者獲取共享記憶體並返回描述符。1.3 函式原型 int shmget key t key,size t size,int shm 1.4 返回值 成功 返回建立或者獲取到的共享記憶體的描述符。失敗 1 1....