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

2021-08-18 16:52:56 字數 1880 閱讀 1665

共享記憶體區是最快的ipc形式。一旦這樣的記憶體對映到共享他的程序的位址空間,這些程序間資料傳遞不再涉及到核心,換句話說就是程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料。

共享記憶體示意圖

共享記憶體資料結構

struct shmid_ds ;
相關函式shmget函式:建立共享記憶體

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

//引數:key為共享記憶體段名字

//size為共享記憶體大小

//shm***有9個許可權標誌構成,他們的用法和建立檔案時使用的mode模式標誌是一樣的

//返回值:成功返回乙個非負整數,即該共享記憶體段的標識碼;失敗返回-1

void *shmat(int shmid,const

void *shmaddr,int shm***);

//引數:shmid共享記憶體識別符號

//shmaddr:指定連線的位址

//shm***:他的兩個可能取值是shm_rnd和shm_rdonly

//返回值:成功返回乙個指標,指向共享記憶體第乙個節;失敗返回-1

1: shmaddr為null,核心自動選擇乙個位址

2:shmaddr不為null且shm***無shm_rnd標記,則以shmaddr為連線位址

3:shmaddr不為null且shm***設定了shm_rnd標記,則連線的位址會自動向下調整為shmlba的整數倍,公式:shmaddr - (shmaddr&shmlba)

4: shm***=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:將要採取的動作(有3個可取值)

//buf:指向乙個儲存著共享記憶體的模式狀態和訪問許可權的資料結構

//返回值:成功返回0,失敗返回-1

cmd取值

1、ipc_stat:把shmid_ds結構中的資料設定為共享記憶體的當前關聯值

2、ipc_set:在金城有足夠許可權的前提下,把共享記憶體的當前關聯值設定為shmid_ds資料結構中給出的值

3、ipc_rmid:刪除共享記憶體段

說明幾點:

1:共享記憶體沒有提供任何保護機制

2:共享記憶體是臨界資源

3:共享記憶體生命週期隨核心(訊息佇列也是)

4:共享記憶體沒有進行同步與互斥

程序間通訊 三 共享記憶體

共享記憶體是linux下倆程序通訊的一種方式,主要功能是讓兩個程序的虛擬位址都對映到同一片實體地址上,就可以通過這片實體地址進行資料的互動 mmap函式要求核心建立乙個新的虛擬記憶體區域,最好是從位址start開始的乙個區域,並將檔案描述符df指定的物件的乙個連續的片對映到這個新的區域,連續的物件片...

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

1.共享記憶體 共享記憶體方式可以在多個程序直接共享資料,因為其直接使用記憶體,不要多餘的拷貝,是速度最快的ipc方式 共享記憶體有兩種實現方式,使用mmap和shm方式,如下圖 1 mmap方式是將檔案與程序位址空間進行對映,對實際物理記憶體影響小 2 shm方式是將每個程序的共享記憶體與實際物理...

程序間通訊(三)之共享記憶體

上接程序間通訊 二 四 共享記憶體 共享記憶體也稱共享儲存,共享記憶體就是指允許兩個或多個程序共享一定的儲存區。因為資料不需要客戶程序和伺服器程序之間複製,所以說共享記憶體時最快的一種ipc。使用共享記憶體時要掌握的唯一要點,就是多個程序之間對一定儲存區的同步訪問。若伺服器程序正在將資料放入共享儲存...