Linux中程序間通訊 共享儲存

2021-08-09 18:02:43 字數 2165 閱讀 9133

今天同樣來看看程序間通訊,前面幾篇介紹了管道,訊號量,訊息佇列,這篇是共享記憶體。

共享儲存允許兩個或更多程序共享一給定的儲存區。因為資料不需要在客戶程序和伺服器程序之間複製,所以這是最快的一種ipc。使用共享儲存時要掌握的唯一竅門是多個程序之間對一給定儲存區的同步訪問。若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應當去取這些資料。通常,訊號量被用來實現對共享儲存訪問的同步。

下面我麼來看看共享儲存操作時的幾個函式:

1、shmget函式

為獲得乙個共享儲存識別符號,呼叫的函式通常是shmget。

int shmget(key_t key,size_t size,int flag);

第乙個引數

,與訊號量的semget函式一樣,程式需要提供乙個引數key(非0整數),它有效地為共享記憶體段命名,shmget函式成功時返回乙個與key相關的共享記憶體識別符號(非負整數),用於後續的共享記憶體函式。呼叫失敗返回-1.

不相關的程序可以通過該函式的返回值訪問同一共享記憶體,它代表程式可能要使用的某個資源,程式對所有共享記憶體的訪問都是間接的,程式先通過呼叫shmget函式並提供乙個鍵,再由系統生成乙個相應的共享記憶體識別符號(shmget函式的返回值),只有shmget函式才直接使用訊號量鍵,所有其他的訊號量函式使用由semget函式返回的訊號量識別符號。

第二個引數,size以位元組為單位指定需要共享的記憶體容量

第三個引數,***是許可權標誌,它的作用與open函式的mode引數一樣,如果要想在key標識的共享記憶體不存在時,建立它的話,可以與ipc_creat做或操作。共享記憶體的許可權標誌與檔案的讀寫許可權一樣,舉例來說,0644,它表示允許乙個程序建立的共享記憶體被記憶體建立者所擁有的程序向共享記憶體讀取和寫入資料,同時其他使用者建立的程序只能讀取共享記憶體。

2、shmat函式

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

void *shmat(int shmid,const void *addr,int flag);

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

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

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

呼叫成功時返回乙個指向共享記憶體第乙個位元組的指標,如果呼叫失敗返回-1.

3、shmdt函式

該函式用於將共享記憶體從當前程序中分離。注意,將共享記憶體分離並不是刪除它,只是使該共享記憶體對當前程序不再可用。該識別符號仍然存在,直至某個程序(一般是伺服器程序)呼叫shmctl(帶命令ipc_rmid)特地刪除,它的原型如下:

int shmdt(void *addr);
addr引數是以前呼叫shmat時的返回值。如果成功,shmdt將使相關shmid_ds結構體中的shm_nattch計數器值減一,返回0,失敗時返回-1

.4、shmctl函式

與訊號量的semctl函式一樣,用來控制共享記憶體,執行多種操作,它的原型如下:

int shmctl(int shmid,int cmd,struct shmid_ds *buf);
第乙個引數

,shm_id是shmget函式返回的共享記憶體識別符號。

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

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

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

ipc_rmid:刪除共享記憶體段

linux和solaris提供了下列另外兩種命令,但他們並非single unix specification的組成部分:

shm_lock:將共享儲存段鎖定在記憶體中。此命令只能由超級使用者執行。

shm_unlock:解鎖共享儲存段。此命令只能由超級使用者執行。

第三個引數,buf是乙個結構指標,它指向共享記憶體模式和訪問許可權的結構。

shmid_ds結構至少包括以下成員:

struct shmid_ds

;

程序間通訊 共享儲存

一 什麼是共享儲存 共享儲存允許兩個或更多程序共享一給定的儲存區。因為資料不需要在程序a和程序b之間複製,所以共享儲存是最快的一種ipc。那麼使用共享儲存需要注意的問題是什麼呢?因為是多個程序訪問乙個共同的儲存區,所以需要注意的問題就是多個程序如何實現對同一儲存區實現同步訪問。若程序a正在將資料放入...

15 9 程序間通訊 共享儲存

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

linux中程序間如何通訊的?

因為程序和執行緒不一樣,他們各自的位址空間不同,互不干擾,主要有以下通訊方式。2,訊號量 你作為同步的一種辦法,當然也算是通訊的一種了,因為多個程序共同依靠訊號量來改變自己的狀態,例如乙個只儲存0,1的訊號量,乙個程序進入臨界區執行p sv 訊號量減1為0,另乙個程序會因為訊號量為0而掛起,當前乙個...