linux 程序間通訊 共享記憶體

2021-08-17 22:17:26 字數 1617 閱讀 5033

一、

共享記憶體的概念

共享記憶體就是在記憶體上找一塊空間,多個程序可以同時使用這塊空間來傳輸資料,這塊空間是這幾個程序所共享的。

正因為這塊空間共享,屬於這幾個程序中的每乙個程序,所以這塊記憶體屬於臨界資源,使用的時候需要用訊號量進行同步控制。

共享記憶體是最快的一種ipc(程序間通訊方式)。

共享記憶體在各個程序中都有直接的指標指向開闢記憶體區域,在訪問時當做本程序中的一塊記憶體,直接訪問。

二共享記憶體的實現

程序a、

b通過訪問核心物件,找到共享區域的首位址。

這塊共享區域是共享的,既屬於a,也屬於

b。所以這塊記憶體既在

a中也在b中。

二共享記憶體的操作

(1)建立或者獲取

intshmget(key_t key, 

size_t

size, 

intshm***); 

成功時返回乙個與key相關的共享記憶體識別符號(非負整數),用於後續的共享記憶體函式。

呼叫失敗返回-1。

key 是鍵值,它有效地為共享記憶體段命名;size 開闢記憶體空間的大小;

shm***是許可權標誌 

shm***: ipc_creat如果存在則獲取,

如果不存在,則建立。

(2)鏈結

第一次建立完共享記憶體時,它還不能被任何程序訪問,shmat函式的作用就是用來啟動對該共享記憶體的訪問,並把共享記憶體連線到當前程序的位址空間。             

void

*shmat(

intshm_id, 

const

void

*shm_addr, 

intshm***);

返回乙個指向記憶體首位址的指標,shm_id是記憶體識別符號;

shm_addr指定共享記憶體連線到當前程序中的位址位置,通常為空,表示讓系統來選擇共享記憶體的位址;

shm_***是一組標誌位,通常為0。

(3)斷開鏈結

該函式用於將共享記憶體從當前程序中分離。不會將共享記憶體刪除,只是使該共享記憶體對當前程序不再可用。

intshmdt(

void

*ptr);

ptr是shmat函式返回的位址指標,呼叫成功時返回0,失敗時返回-1. 

(4)刪除核心物件

intshmctl(

intshm_id, 

intcommand, 

struct

shmid_ds *buf); 

command是要採取的操作,它可以取下面的三個值:

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

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

ipc_rmid:刪除共享記憶體段

buf是乙個結構指標,它指向共享記憶體模式和訪問許可權的結構。這個結構如下

shmid_ds結構至少包括以下成員

struct

shmid_ds

; 四共享記憶體的實現

Linux程序間通訊 共享記憶體

共享記憶體是執行在同一臺機器上的程序間通訊最快的方式,因為資料不需要在不同的程序間複製。通常由乙個程序建立一塊共享記憶體區,其餘程序對這塊記憶體區進行讀寫。共享記憶體往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。首先要用的函式是shmget,它獲得乙個共享儲存識別符號。i nclu...

Linux程序間共享記憶體通訊

使用共享記憶體基本分四個步驟 獲得共享記憶體 shmget 對映共享記憶體shmat 解除對映shmdt 刪除共享記憶體shmctl 於是自己在網上找來了乙個例子看了下,並且用虛擬機器單獨跑了下共享記憶體的經典例程看了下,才知道了自己的問題出現 了 發現有時候只要自己親自將程式一步一步的去測,才知道...

Linux程序間通訊 共享記憶體

之前提到了程序間通訊的管道,訊息佇列,訊號量,然後其中訊號量是pv操作,操控的是乙個共享資源。在我們提到的ipc模組中,訊息佇列針對的是資料單元的資訊傳送,管道不屬於system v ipc的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...