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

2021-09-26 03:09:54 字數 2154 閱讀 8297

接下來總結程序間通訊的另外一種方式----共享記憶體。

1、概念

共享記憶體是一種最為高效的程序間通訊方式,指兩個或多個程序共享乙個給定的儲存區。它通過核心物件將程序中的虛擬位址對映到相同的物理記憶體上,因此系統分配共享記憶體是按照"頁"為單位。

2、特點

共享記憶體是最快的一種 ipc,因為程序是直接對記憶體進行訪問。

因為多個程序可以同時操作,所以需要進行同步。

訊號量+共享記憶體通常結合在一起使用,訊號量用來同步對共享記憶體的訪問。

3、函式原型

#include int shmget(key_t key, size_t size, int flag);// 建立或獲取乙個共享記憶體:成功返回共享記憶體id,失敗返回-1

int shmdt(void *addr); // 斷開與共享記憶體的連線:成功返回0,失敗返回-1

需要注意的是:

當用shmget函式建立一段共享記憶體時,必須指定其 size;而如果引用乙個已存在的共享記憶體,則將 size 指定為0 。

當一段共享記憶體被建立以後,它並不能被任何程序訪問。必須使用shmat函式連線該共享記憶體到當前程序的位址空間,連線成功後把共享記憶體區物件對映到呼叫程序的位址空間,隨後可像本地空間一樣訪問。

shmdt函式是用來斷開shmat建立的連線的。注意,這並不是從系統中刪除該共享記憶體,只是當前程序不能再訪問該共享記憶體而已。

shmctl函式可以對共享記憶體執行多種操作,根據引數 cmd 執行相應的操作。常用的是ipc_rmid(從系統中刪除該共享記憶體)。

4、模擬共享記憶體我們用server來建立共享儲存段,用client獲取共享儲存段的識別符號,二者關聯起來之後server將資料寫入共享儲存段,client從共享區讀取資料。通訊結束之後server與client斷開與共享區的關聯,並由server釋放共享儲存段。 

comm.h

#ifndef _comm_h__

#define _comm_h__

#include#include#include#include#define pathname "."

#define proj_id 0x6666

int createshm(int size);

int destroyshm(int shmid);

int getshm(int size);

comm.c

#include"comm.h"

static int commshm(int size,int flags)

int shmid = 0;

if((shmid = shmget(key,size,flags)) < 0)

return shmid;

}int destroyshm(int shmid)

return 0;

}int createshm(int size)

int getshm(int size)

server.c

#include"comm.h"

int main()

shmdt(addr);

sleep(2);

destroyshm(shmid);

return 0;

}

client.c 

#include"comm.h"

int main()

shmdt(addr);

sleep(2);

return 0;

}

5、總結:(1)優點:使用共享記憶體進行程序之間的通訊是非常方便的,資料的共享還使程序間的資料不用傳送,而是直接訪問記憶體,加快了程式的效率。

(2)缺點:共享記憶體沒有提供同步機制,多個程序共享同一塊物理記憶體空間,則程序訪問時必須為互斥訪問,必須通過同步機制(訊號量)來進行控制。

Linux下程序間通訊之共享記憶體

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

Linux程序間通訊 共享記憶體

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

Linux程序間共享記憶體通訊

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