1. 程式人生 > >Linux (六)程序間通訊(共享記憶體)

Linux (六)程序間通訊(共享記憶體)

上篇部落格我們講了,匿名管道,命名管道,訊息佇列,並使用了他們,初步瞭解了程序間通訊的概念。下面我們要說共享記憶體。

共享記憶體函式
shmget函式
功能:用來建立共享記憶體
原型
int shmget(key_t key,size_t size,int shmflg);
引數
key:這個共享記憶體段名字
size:共享記憶體大小
shmflg:由九個許可權標誌構成,他們的用法和建立檔案時使用的mode模式標誌是一樣的
返回值:成功返回一個非負整數,即該記憶體段的表示碼,失敗返回-1

shmat函式
功能:將共享記憶體段連線到程序地址空間
原型
void *shmat(int shmid,const void *shmaddr,int shmflg);
引數
shmid:共享記憶體標識碼
shmaddr:指定連線的地址
shmflg:它的兩個可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回一個指標,指向共享記憶體的第一個位元組,失敗返回-1
說明:
shmaddr為NULL,核心自動選擇地址
shmaddr不為NULL且shmflg無SHM_RND標記,則以shmaddr為連線地址。
shmaddr不為NULL且shmflg設定了HSM_RND標記,則連線的地址會自動向下調整為SHMLBA的整數倍。公式:shmaddr - (shmaddr %SHMLVA)
shmflg = SHM_RDONLY,表示連線操作用來只讀共享記憶體

shmdt函式
功能:將共享記憶體段與當前程序脫離
原型
int shmdt(const void *shmaddr);
引數
shmaddr:有shmat所返回的指標
返回值:成功返回0;失敗返回-1;
注意:將共享記憶體段與當前程序脫離不等於刪除共享記憶體段

shmctl函式
功能:用於控制共享記憶體
原型
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
引數:
shmid:由shmget返回的共享記憶體的標識碼
cmd:將要採取的動作(由三個可取值)
buf:指向一個儲存著共享記憶體的模式狀態和訪問許可權的資料結構
返回值:成功返回0;失敗返回-1

命令:IPC_STAT :把shmid_ds結構中的資料設定為共享記憶體的當前關聯值
IPC_SET:當程序有足夠許可權的前提下, 把共享記憶體的當前關聯值設定為shmid_ds資料結構中給出的值
IPC_RMID:刪除共享記憶體段
下面就是具體的程式碼實現
這裡寫圖片描述這裡寫圖片描述這裡寫圖片描述這裡寫圖片描述

下面就是實現的效果
這裡寫圖片描述

這裡寫圖片描述

如有錯誤請指出,謝謝