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