程序間通訊方式 4 共享記憶體 shm

2021-08-18 21:55:37 字數 3618 閱讀 6668

共享記憶體就是允許兩個或多個程序共享一定的儲存區。就如同 malloc() 函式向不同程序返回了指向同乙個物理記憶體區域的指標。當乙個程序改變了這塊位址中的內容的時候,其它程序都會察覺到這個更改。因為資料不需要在客戶機和伺服器端之間複製,資料直接寫到記憶體,不用若干次資料拷貝,所以這是最快的一種ipc。

注:共享記憶體沒有任何的同步與互斥機制,所以要使用訊號量來實現對共享記憶體的訪問的同步。

程序間通訊方式——訊息佇列

注:其中的同只是將資料結構中的訊息佇列msg換成shm而已

所有的函式共用標頭檔案

[cpp]view plain

copy

#include 

#include 

#include 

3.1建立共享記憶體——>shmget() 函式

[cpp]view plain

copy

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

//成功返回共享記憶體的id,出錯返回-1          

(1)第乙個引數key是長整型(唯一非零),系統建立ipc通訊 ( 訊息佇列、 訊號量和 共享記憶體) 時必須指定乙個id值。通常情況下,該id值通過ftok函式得到,由核心變成識別符號,要想讓兩個程序看到同乙個訊號集,只需設定key值不變就可以。

(2)第二個引數size指定共享記憶體的大小,它的值一般為一頁大小的整數倍(未到一頁,作業系統向上對齊到一頁,但是使用者實際能使用只有自己所申請的大小)。

(3)第三個引數shm***是一組標誌,建立乙個新的共享記憶體,將shm*** 設定了ipc_creat標誌後,共享記憶體存在就開啟。而ipc_creat | ipc_excl則可以建立乙個新的,唯一的共享記憶體,如果共享記憶體已存在,返回乙個錯誤。一般我們會還或上乙個檔案許可權

3.2操作共享記憶體———>shmctl()函式

[cpp]view plain

copy

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

//成功返回0,出錯返回-1  

(1)第乙個引數,shm_id是shmget函式返回的共享記憶體識別符號。

(2)第二個引數,cmd是要採取的操作,它可以取下面的三個值 :    

ipc_stat:把shmid_ds結構中的資料設定為共享記憶體的當前關聯值,即用共享記憶體的當前關聯值覆蓋shmid_ds的值。    

ipc_set:如果程序有足夠的許可權,就把共享記憶體的當前關聯值設定為shmid_ds結構中給出的值    

ipc_rmid:刪除共享記憶體段

(3)第三個引數,buf是乙個結構指標,它指向共享記憶體模式和訪問許可權的結構。 shmid_ds結構至少包括以下成員 

[cpp]view plain

copy

struct shmid_ds    

;          

建立共享儲存段之後,將程序連線到它的位址空間

[cpp]view plain

copy

void *shmat(int shm_id, const void *shm_addr, int shm***);   

//成功返回指向共享儲存段的指標,出錯返回-1  

(1)第乙個引數,shm_id是由shmget函式返回的共享記憶體標識。

(2)第二個引數,shm_addr指定共享記憶體連線到當前程序中的位址位置,通常為空,表示讓系統來選擇共享記憶體的位址。

(3)第三個引數,shm_***是一組標誌位,通常為0

該操作不從系統中刪除識別符號和其資料結構,要顯示呼叫shmctl(帶命令ipc_rmid)才能刪除它

[cpp]view plain

copy

int shmdt(const void *shmaddr);   

//成功返回0,出錯返回-1

(1)addr引數是以前呼叫shmat時的返回值

通過檢視共享記憶體狀態可以知道作業系統提供給使用者的共享記憶體為4097個位元組,實際上作業系統開闢了8k個位元組,而且由於接收方client還沒掛接,所以掛接數為1。

執行結果:

共享記憶體中的資料並不會像管道或者訊號量等被一端讀取之後就不存在。

優點:我們可以看到使用共享記憶體進行程序間的通訊真的是非常方便,而且函式的介面也簡單,資料的共享還使程序間的資料不用傳送,而是直接訪問記憶體,也加快了程式的效率。同時,它也不像匿名管道那樣要求通訊的程序有一定的父子關係(system v版本共有)。

缺點:共享記憶體沒有提供互斥同步的機制,這使得我們在使用共享記憶體進行程序間通訊時,往往要借助其他的手段比如訊號量等來進行程序間的同步工作。 

其他程序間通訊方式詳解:

程序間通訊之共享記憶體 shm

include include include struct shm共享記憶體使用的結構體的宣告 int main int argc,const char argv shmid shmget key,sizeof struct shm ipc creat ipc excl 0666 共享記憶體的獲取...

程序間通訊方式 共享記憶體

所有的函式共用標頭檔案 include include include 3.1建立共享記憶體 shmget 函式 int shmget key t key,size t size,int shm 成功返回共享記憶體的id,出錯返回 1 1 第乙個引數key是長整型 唯一非零 系統建立ipc通訊 訊息...

Linux下程序通訊 共享記憶體之 shm

程序通訊 程序與程序間的資料交換,稱為程序通訊。程序通訊的方式有 共享記憶體 訊號量 管道 訊息佇列 socket等等。共享記憶體 核心管理一片物理記憶體,允許不同的程序同時對映,多個程序可以對映同一塊記憶體,被多個程序同時對映的物理記憶體,即共享記憶體。對映物理記憶體叫掛接,用完以後解除對映叫脫接...