程序間通訊 共享儲存

2021-08-09 18:00:29 字數 1231 閱讀 7847

一、什麼是共享儲存

共享儲存允許兩個或更多程序共享一給定的儲存區。因為資料不需要在程序a和程序b之間複製,所以共享儲存是最快的一種ipc。那麼使用共享儲存需要注意的問題是什麼呢?因為是多個程序訪問乙個共同的儲存區,所以需要注意的問題就是多個程序如何實現對同一儲存區實現同步訪問。若程序a正在將資料放入共享儲存區,則在它做完這一操作之前,程序b不應該去讀取這些資料。通常,訊號量用於實現對共享儲存訪問的同步,所以,在使用共享儲存解決問題時,需要在其中聯合訊號量操作。

共享儲存的原理:

程序a和程序b同時擁有同一塊儲存區域,這塊區域既可以屬於程序a,也可以屬於程序b。

共享儲存也有核心物件來管理共享的記憶體區域

二、linux中共享儲存相關操作

1、建立或者獲取函式

int shnget((key_t)key,size_t size,int flag); 返回值:若成功則返回共享儲存id,失敗則返回-1

size:將要開闢的記憶體空間的大小

flag:ipc_creat-如果存在共享儲存,則直接獲取共享儲存id

-如果不存在,則建立新的共享儲存

2、鏈結

void *shmat(int shmid,void *addr,int flag); 返回值:若成功則返回指向共享儲存的指標,若失敗則返回-1

如果addr為0,則由核心選擇

如果addr不為0,並且flag沒有指定為shm_rnd,則此段連線到addr所指定的位址上

如果addr非0,並且指定flag為shn_rnd,則此段連線到向addr低邊界位址倍數取整的位址上。

3、斷開鏈結

int shmdt(void *ptr); 返回值:若成功則返回0,失敗則返回-1

此函式只完成斷開鏈結操作,並不會刪除共享記憶體。如果想刪除共享記憶體,那麼在shmctl函式中,引數cmd取ipc_rmid

4、刪除核心物件

int shmctl(int shmid,int cmd,struct shmid_ds *buff); 返回值:若成功則返回0,若失敗則返回-1

注意:共享記憶體是兩個以上的程序能夠操作同一塊物理空間的記憶體區域,所以共享的區域就成了臨界資源,所以對於共享區域的訪問就必須要使用訊號量做同步控制。

15 9 程序間通訊 共享儲存

因為資料不需要在客戶程序和伺服器程序之間複製,所以共享儲存是最快的一種ipc。使用共享儲存時要掌握的唯一竅門是多個程序之間對一給定儲存區的同步訪問。通常,訊號量或記錄鎖被用來實現對共享儲存訪問的同步。返回值 若成功則返回指向共享儲存的指標,若出錯則返回 1 shmget獲得乙個共享儲存識別符號。si...

Linux中程序間通訊 共享儲存

今天同樣來看看程序間通訊,前面幾篇介紹了管道,訊號量,訊息佇列,這篇是共享記憶體。共享儲存允許兩個或更多程序共享一給定的儲存區。因為資料不需要在客戶程序和伺服器程序之間複製,所以這是最快的一種ipc。使用共享儲存時要掌握的唯一竅門是多個程序之間對一給定儲存區的同步訪問。若伺服器程序正在將資料放入共享...

程序間通訊 共享記憶體

下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...