Linux程序間通訊 共享記憶體

2021-07-23 04:47:36 字數 2490 閱讀 9866

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

什麼是共享記憶體?

共享記憶體是多個程序之間共享記憶體區域的一種程序間的通訊方式,他是在多個程序之間對記憶體段進行對映的方式實現記憶體共享的,這是ipc最快捷的方式,因為共享記憶體的方式的通訊沒有中間過程,二管道,訊息佇列等方式則是需要將資料通過中間機制進行轉換。

共享記憶體方式直接將某段記憶體段進行對映,多個程序間的共享記憶體是統一快的物理空間,僅僅阿是位址不同而已,因此不需要進行複製,可以直接使用此段空間。

1.建立共享記憶體函式:      

#include#includeint shmget(key_t key,size_t size,int shm***);
第乙個引數是關鍵字的值,然後,這個值將與核心中現有德1其他共享記憶體段的關鍵字值相比較,比較之後,依賴第3個引數,跟前面訊息佇列的一樣。

2.獲取共享記憶體位址函式shmat()

函式shmat()用來獲取共享記憶體的位址,獲取共享記憶體成功後,可以像使用通用記憶體一樣對其進行讀寫操作,

#include#includevoid* shmat(int shmid,const void *shmaddr,int shm***);

int shmdt(const void *shmaddr);

如果shmaddr引數值等於0,則內科將試著查詢乙個未對映的區域,使用者可以指定乙個位址,但通常改位址只用於訪問所擁有的硬體,或者解決與其他應用程式的衝突。shm_rnd標誌可以與標誌引數進行or操作,結果在置為標誌引數。shm_rdonly標誌引數進行or操作,結果在置為標誌引數,這樣對映的共享記憶體端智慧型標記為唯讀方式。

shmdt()用於刪除一段共享記憶體,這個函式之中,成功完成了斷開連線操作以後,相關的shmid_ds結構的shm_nattch成員的值將減去1。如果這個值減到0.則核心將真正刪除這個共享記憶體。

4.共享記憶體控制函式shmctl()

#include#includeint shmctl(int shmid,int cmd,struct shmid_ds*buf);
第二個引數為:ipc_set,獲取記憶體短的shmid_ds結構。並把它儲存在buf引數所指定的位址中。設定記憶體段shmid_ds結構的ipc_pern成員的值,此命令是從buf引數中獲得該值。

ipc_rmid:標記某記憶體段,以被刪除。並不是真正的把記憶體段從記憶體中刪除,相反,它只是標記上該記憶體段,以備將來刪除,最後乙個斷開,刪除操作才會發生。

下面看看實際**:

#pragma once

#include #include #include #include #include #include #include #define _path_ "."

#define _project_ 0x777

#define _shm_size_ 4*1024

int get_shm();

void* at_shn();

int delete_shm();

int rm_shm();

#include "shm.h"

int get_shm()

int flag =ipc_excl| ipc_creat |0666;

int shm_id = shmget(key,_shm_size_,flag);

if(shm_id 

else

return shm_id;

}     

void* at_shm(int shm_id)

int delete_shm(char *addr)

int rm_shmctl(int shm_id)

//shm_test.c

#include "shm.h"

int main()

pid_t id = fork();

if(id <0)

else if(id == 0)

buf[4095] = '\0';

delete_shm(buf);

} else

delete_shm(buf);

waitpid(id,null,0);

rm_shmctl(shm_id);

} return 0;

}

執行結果:

總結:其實共享記憶體是在ipc程序間通訊最快的一種方式,因為他是直接針對實體地址進行的操作,而且對於他的資源控制,我們需要配合訊號量進行操作,來防止死鎖的產生。

本文出自 「剩蛋君」 部落格,請務必保留此出處

Linux程序間通訊 共享記憶體

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

Linux程序間共享記憶體通訊

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

Linux程序間通訊 共享記憶體

一 共享記憶體 1 共享記憶體的概念 顧名思義,共享記憶體就是允許兩個不相關的程序訪問同乙個邏輯記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問...