1、概念:
共享記憶體允許兩個不相干的程序訪問同乙個邏輯記憶體。
共享記憶體是最快的ipc形式。省略了兩次拷貝,不再涉及到核心,程序不再通過通過執行核心中的系統呼叫來傳遞彼此的資料。共享記憶體的生命週期隨核心。
優點:
1)資料的共享使程序間的資料不用相互的傳遞,而是直接通過訪問記憶體,加快了效率。
缺點 1)共享記憶體沒有同步與互斥機制,我們需要用其他方法進行程序間的同步機制。
我們需要借助互斥量或者訊號量來完成程序的同步與互斥,在這裡說一下互斥量和訊號量 。互斥量用於執行緒的互斥,訊號量用於執行緒的同步。
2)沒有同步也就是說當乙個程式對共享記憶體進行操作的時候,並沒有自動機制去阻止第二個程式去操作它。不同程序之間共享的是同一段物理記憶體,所以也會導致程序之間相互的產生影響。
3)共享記憶體並不會隨著進成的退出的而退出,因此我們在最後不使用該空間時,必須手動的去刪除。
2、共享記憶體函式:
shmget函式
功能:用來建立共享記憶體 原型:shmat函式int shmget(key_t key,size_t size,int shm***);
引數:
key:這個共享記憶體段名字
size:共享記憶體大小(通常以頁為單位)
shm***:由九個許可權標誌構成,它們的用法和建立檔案時使用的mode模式標誌是一樣的。
返回值:成功返回乙個非負整數,即該共享記憶體段的標識碼;失敗返回-1;
功能:講共享記憶體段連線到程序位址空間。shmdt函式原型:
void *shmat(int shmid ,const void *shmaddr,int shm***);
引數:
shmid:共享記憶體標識;
shmaddr:指定連線的位址
shm***:它的兩個可能取值是:shm_rnd和shm_rdonly
返回值:成功返回乙個指標,指向共享記憶體的第乙個節,失敗返回的是-1
功能:將共享記憶體段與當前程序進行脫離shmctl函式原型 int shmdt(const void *shmaddr);
引數:
shmaddr:由shmat所返回的指標
返回值:成功返回的是0,失敗返回的是-1;
注意:將共享記憶體段與當前程序脫離不等於刪除共享記憶體段
功能:用於控制共享記憶體命令原型:
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 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...