程序間通訊 共享記憶體

2021-08-19 04:45:44 字數 3265 閱讀 9922

1、概念

共享記憶體允許兩個不相干的程序訪問同乙個邏輯記憶體。

共享記憶體是最快的ipc形式。省略了兩次拷貝,不再涉及到核心,程序不再通過通過執行核心中的系統呼叫來傳遞彼此的資料。共享記憶體的生命週期隨核心。

優點:

1)資料的共享使程序間的資料不用相互的傳遞,而是直接通過訪問記憶體,加快了效率。

缺點 1)共享記憶體沒有同步與互斥機制,我們需要用其他方法進行程序間的同步機制。

我們需要借助互斥量或者訊號量來完成程序的同步與互斥,在這裡說一下互斥量和訊號量 。互斥量用於執行緒的互斥,訊號量用於執行緒的同步。

2)沒有同步也就是說當乙個程式對共享記憶體進行操作的時候,並沒有自動機制去阻止第二個程式去操作它。不同程序之間共享的是同一段物理記憶體,所以也會導致程序之間相互的產生影響。

3)共享記憶體並不會隨著進成的退出的而退出,因此我們在最後不使用該空間時,必須手動的去刪除。

2、共享記憶體函式:

shmget函式

功能:用來建立共享記憶體 原型:

int shmget(key_t key,size_t size,int shm***);

引數:

key:這個共享記憶體段名字

size:共享記憶體大小(通常以頁為單位)

shm***:由九個許可權標誌構成,它們的用法和建立檔案時使用的mode模式標誌是一樣的。

返回值:成功返回乙個非負整數,即該共享記憶體段的標識碼;失敗返回-1;

shmat函式

功能:講共享記憶體段連線到程序位址空間。

原型:

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

引數:

shmid:共享記憶體標識;

shmaddr:指定連線的位址

shm***:它的兩個可能取值是:shm_rnd和shm_rdonly

返回值:成功返回乙個指標,指向共享記憶體的第乙個節,失敗返回的是-1

shmdt函式

功能:將共享記憶體段與當前程序進行脫離

原型 int shmdt(const void *shmaddr);

引數:

shmaddr:由shmat所返回的指標

返回值:成功返回的是0,失敗返回的是-1;

注意:將共享記憶體段與當前程序脫離不等於刪除共享記憶體段

shmctl函式

功能:用於控制共享記憶體

原型:

int shmctl(int shmid ,int cmd, struct shmid_ds *buf);

引數:

shmid:由shmget返回的共享記憶體標識碼

cmd:將要採取的動作(有三個可能值)

buf:指向乙個儲存著共享記憶體的模式狀態和訪問許可權的資料結構

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

命令

說明ipc_stat

把shmid_ds結構中的資料設定為共享記憶體的當前關聯值

ipc_set

在程序有足夠許可權的前提下,把共享記憶體的當前關聯值設定為shmid_ds資料結構中給出的值

ipc_rmid

刪除共享記憶體段

makefile的實現:

1 .phony:clean

2 all:server

client34

client:client.c comm.c

5 gcc -o $@ $^

6server:server.c comm.c

7 gcc -o $@ $^

8 .phony:clean

9 clean:

10 rm -f client

server

11 ~

comm.h的實現

1

#include

2#include

3#include

4#include 56

#define pathname "."

7#define proj_id 0x666689

int createshm(int size);

10int destroyshm(int shmid);

11int getshm(int size);

comm.c的實現:

1 #include "comm.h"

23 static int commshm(int

size,int flags)

4 10int shmid=0;

11if((shmid=shmget(_key,size,flags))<0)

15return shmid;

16 }

1718

19int destroyshm(int shmid)

20 25return

0; 26 }

2728

int createshm(int

size)

3132

int getshm(int

size)

33 36

server.c的實現

1

#include "comm.h"

2int main()

3 12 shmdt(addr);

13sleep(2);

14 destroyshm(shmid);

15return

0; 16 }

17

client.c的實現

1

#include "comm.h"23

int main()

4 16 shmdt(addr);

17sleep(2);

18return

0; 19 }

我在後期執行結構是正確的但是但我第二次在進行執行的時候,我發現和以前的幾種程序間通訊的例子都是一下那個痛的,發現檔案這是已經存在了,這時候我們就必須嘗試的進行刪除檔案。可是我在刪除檔案的時候遇到的困難就是刪除不了,剛開始,我以為是因為許可權的問題,在修改完之後,依然還有刪除不了的問題,這個問題在這裡一直沒解決了。後期我會嘗試去努力的解決掉這個問題。

程序間通訊 共享記憶體

下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...

程序間通訊 共享記憶體

共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體實現分兩個步驟 建立共享記憶體,使用shmget函式 對映共享記憶體,使用shmat函式 共享記憶體是一種最為高...

程序間通訊 共享記憶體

共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...