IPC通訊之共享記憶體

2021-08-01 16:45:21 字數 2245 閱讀 9411

共享記憶體就是使得多個程序可以訪問同一塊記憶體空間,是最快的可用

ipc形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。

我們通過一張圖來表示這個關係

共享記憶體和訊息佇列,訊號量一樣都屬於xsi ipc。核心都為他們維護了一套資料結構

同樣,系統還是會維護乙個key用來標識,我們還是通過ftok()函式來得到這個key。

其中pathname是路徑名。一般設為當前路徑".";proj_id則是專案id。

返回值:成功返回共享儲存區的shmid,若失敗,返回-1。 

引數key即為我們呼叫ftok函式得到的識別符號,作為系統對此共享儲存資源的唯一標識。 

引數size是要申請的共享儲存區的大小,以位元組為單位,這個數一般為系統頁長的整數倍(4k的整數倍)。若申請的size不是頁長的整數倍,系統也是按整數倍進行分配的,但是最後一頁餘下的部分不可用。如果建立乙個新的資源,則必須指定size,且段的內容會被初始化為0。若引用乙個已經存在的,則將size置為0。 

引數flag與訊息佇列相同,有兩個選項,ipc_creat和ipc_excl。使用的時候有兩種情況: 

① ipc_creat和ipc_excl一起使用(ipc_creat|ipc_excl),表示申請建立乙個新的ipc資源,若要申請的資源已經存在,則錯誤返回。若不存在,則建立。 

② ipc_creat單獨使用,表示申請建立乙個ipc資源,若要申請的ipc資源已經存在,則直接使用;若不存在,則建立新的。 

一般我們還會在後面加上資源的預設許可權(如0666)。

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

引數shmid即為我們呼叫shmget得到的共享儲存的id。 

引數cmd指定了要執行了命令,當cmd被設定為ipc_rmid時,該函式執行刪除動作。此時,第三個引數設為null。 

除此之外,cmd還有ipc_stat,ipc_set等命令。

返回值:若成功,返回指向共享記憶體儲存的指標,若失敗,返回-1。 

shmid不再多說,attr引數決定了共享儲存段連線到呼叫程序的那個位址。一般我們設定為null或0,表示此段連線到由核心選擇的第乙個可用位址上。這是推薦的使用方式。 

如果引數flag指定了shm_rdonly,則以唯讀方式連線,否則以讀寫的方式連線。 

如果此函式成功執行的話,那麼核心將使與該共享儲存段相關的shmid_ds結構中的shm_nattch計數器值加1。

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

引數addr是之前呼叫shmat的返回值。如果函式執行成功的話,shmdt將使相關shmid_ds結構中的shm_nattch計數器減1。 

當使用完共享儲存後,呼叫此函式令程序與它分離,但共享儲存並不會消失,其識別符號仍然還在,直到有程序呼叫shmctl將其刪除。

標頭檔案

原始檔

客戶機client.c

伺服器server.c

執行client和server之後,我們會發現

然後我們通過監視去看

我們發現這個共享記憶體的shmid為688144,掛載了兩個程序nattch為2。

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

每個程序各自有不同的使用者位址空間,任何乙個進 程的全域性變數在另乙個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝 區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊 ipc,interprocess commun...

IPC之共享記憶體

標頭檔案 sys shm.h ipcs m 檢視共享記憶體狀況 1 共享記憶體的建立 shmget 函式 同一段記憶體被不同程序共享 但是共享記憶體並不提供同步機制 需要訊號量等加以輔助 int shmget key t key,size t size,int shm key ipc private...

多程序通訊(IPC) 共享記憶體

1 共享記憶體介紹 共享記憶體可以說是最有用的程序間通訊方式,也是最快的ipc形式。兩個不同程序a b共享記憶體的意思是,同一塊物理記憶體被對映到程序a b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和...