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

2021-10-25 17:56:08 字數 2470 閱讀 6720

共享記憶體是基於虛擬記憶體的機制,在程序的位址空間中,共享區域的虛擬頁通過核心中的頁表對映到實際的物理頁中,當多個程序都對映到同一塊物理頁,那麼它們訪問的就是同一片物理記憶體,即共享記憶體。

此時基於同一片記憶體,程序間進行資訊傳輸的速度將非常快,每個程序相當於訪問自己位址空間內的記憶體資料

關鍵函式:

key_t ftok(const char* pathname,int proj_id)
該函式通過將乙個linux目錄名和乙個專案id生成唯一的乙個ipc鍵值。目錄必須存在,並且目錄不變時,不同程序之間生成的ipc鍵值是不變的,由此不同程序基於該函式獲得對ipc資源的訪問指標。

int shmget(key_t key,size_t size,int shm***)
void* shmat(int shmid,const void* shmaddr,int shm***)
int shmctl(int shmid,int cmd,struct shmid_ds* buf)
【演示】

伺服器端:

通過filename+proj_id建立乙個ipc資源key

基於該key通過系統呼叫shmget建立大小為4096的共享記憶體區

每隔一定時間的讀取共享記憶體的內容,並列印

#include#include#include#includeusing namespace std;

#define pathname "." //當前程式所在目錄下生成ipc資源

#define proj_id 2 //當同一目錄下有多個ipc資源 通過id區分

#define shame_size 4096

int main()

{ key_t key=ftok(pathname,proj_id);//在當前目錄下生成ipc key

if(key<0)

{cout<

string pre;

while(1)

{//不斷列印共享記憶體 當為quit時退出

string temp;

for(int i=0;i客戶端:

通過ftok函式獲得指定的ipc key

基於ipc key通過shmget獲得共享記憶體資源

通過shmat掛載到共享記憶體,獲得共享記憶體虛擬位址addr

通過虛擬位址addr寫入字串

#include#include#include#includeusing namespace std;

#define pathname "." //當前程式所在目錄下生成ipc資源

#define proj_id 2 //當同一目錄下有多個ipc資源 通過id區分

#define shame_size 4096

int main()

{ key_t key=ftok(pathname,proj_id);//在當前目錄下生成ipc key

if(key<0)

{cout<

while(1)

{//列印該共享記憶體內容

string str;

cin>>str;

for(int i=0;i【執行與演示】

g++ share_mem_client.cpp -o shm_client

g++ share_mem_server.cpp -o shm_server

編譯生成可執行目標檔案

首先啟動服務端   ./shm_server

ipcs -m    通過 -m 檢視本機mem共享記憶體的ipc資源

可以看到最後一行是我們通過shm_server建立的共享記憶體ipc資源  其大小為4096bytes   perms指明ipc檔案的許可權。

繼續啟動客戶端 ./shm_client

可以看到兩個程序通過讀寫共享記憶體,實現了通訊。

關閉客戶端、服務端=》重新啟動服務端=》可以看到共享記憶體的內容仍然存在

由此可見,基於system v ipc下共享記憶體的實現主要有以下特點:

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

兩個不同程序a b共享記憶體的意思是,同一塊物理記憶體被對映到程序a b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和訊號量都可以。ipcs m 檢視共享記憶體 ipcrm m shmid 刪除共享記憶...

程序間通訊IPC 共享記憶體

共享記憶體 共享記憶體 就是開闢一段物理記憶體使多個程序共享 是程序間最高效的傳輸方式 共享記憶體必須結合其他方式來實現程序間的同步 程式設計步驟 1 開闢一段共享記憶體 int shmget key t key,size t size,int shm key t key ftok a stat s...

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

共享記憶體區是最快的ipc形式。一旦這樣的記憶體對映到共享它的程序的位址空間,這些程序間資料傳遞不再涉及到核心,換句話說是程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料。用管道或者訊息佇列傳遞資料,核心為每個ipc物件維護乙個資料結構 用共享記憶體傳遞資料 struct shmid ds inc...