繼學習過程序間通訊的兩種方式管道和訊息佇列之後,接下來就要學習乙個速度最快的
程序間通訊的方式——共享記憶體。
為什麼說共享記憶體是最快的ipc形式呢?因為它省掉了兩次資料拷貝的過程。一旦這樣的記憶體對映到共享
他的程序的位址空間,這些程序間資料傳遞不在涉及到核心(就是程序不在通過執行進入核心的系統呼叫來
傳遞資料)。
1、共享記憶體的示意圖
2、共享記憶體在作業系統這的資料結構:(使用命令 cat /usr/include/linux/shm.h可檢視
詳細資料結構)
3、共享記憶體的特點
在共享記憶體中有乙個nattch ,它可以顯示出當前有幾個程序聯結著這塊共享記憶體。
4、共享記憶體的藉口函式
(1)共享記憶體的建立函式
int shmget(key_t key,size_t size,int shm***);
引數:key(非0整數):共享記憶體段的名字(與訊息佇列類似,由ftok()函式獲得);
size:共享記憶體的大小(以頁為單位,一頁的大小為4096kb);
shm***:許可權標誌,與open函式的mode引數一樣;
(2)將共享記憶體與程序進行連線的連線函式
void *shmat(int shm_id, const void *shm_addr, int shm***);
引數:shm_id: 是由shmget 函式返回的共享記憶體識別符號;
shm_addr:指定共享記憶體連線到當前程序的位址位置,通常為空,表示讓系統來選擇
共享記憶體的位址;
shm_***:是一組標誌位,通常為0;
(3)共享記憶體與程序的去關聯函式
int shmdt(const void *shmaddr);
(4)共享記憶體控制(刪除)函式
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
引數:shm_id:是shmget函式返回的共享記憶體識別符號;
cmd: 控制共享記憶體要採取的操作,可以取以下三個值(我們要銷毀共享記憶體,用ipc_rmid即可);
5、共享記憶體的實現
comm.c
comm.h#include "comm.h"
static int commshm(int size,int flags)//利用引數判斷建立還是獲取
int shmid=shmget(key,size,flags);
if(shmid<0)
return shmid;
}int creatshm(int size)//建立共享記憶體
int getshm(int size)//獲取共享記憶體
int destroy(int shmid)//銷毀共享記憶體
return 0;
}
server.c#ifndef _comm_h__
#define _comm_h__
#include #include #include #include #define pathname "."
#define proj_id 0x6666
int creatshm(int size);
int destroyshm(int shmid);
int getshm(int size);
#endif
client.c#include "comm.h"
int main()
shmdt(addr);
sleep(5);
destroy(shmid);
return 0;
}
makefile#include "comm.h"
int main()
shmdt(addr);
sleep(1);
return 0;
}
測試過程及結果:.phony:all
all:server client
server:server.c comm.c
gcc -o $@ $^
client:client.c comm.c
gcc -o $@ $^
.phony:clean
rm -f client server
當我們寫完makefile後,make進行編譯,然後執行./server進行建立共享記憶體
在共享記憶體中,我們也可以用命令ipcs -m檢視共享記憶體,也可用ipcrm -m+編號進行刪除。
共享記憶體就這樣完成了。
程序間通訊之共享記憶體
此程式實現兩個普通程序間通過共享記憶體來進行通訊,共享記憶體能夠進行大資料量的通訊,這一點事訊息佇列無法比擬的。在這裡同時使用了訊號量來保證兩個程序間的讀寫同步。傳送端源 include include include include include include include include ...
程序間通訊之共享記憶體
1.概念 共享記憶體就是多個程序的位址空間對映到同乙個物理記憶體,多個程序都能看到這塊物理記憶體,共享記憶體可以提供給伺服器程序和客戶程序之間進行通訊,不需要進行資料的複製,所以速度最快。2.共享記憶體操作需要的函式 1 我們需要利用ftok函式生成key識別符號。key t ftok const ...
程序間通訊之共享記憶體
ipc物件這個概念需要理解,因為好多書或者料就直接說ipc就是共享記憶體 訊息佇列 訊號燈集,其實ipc是一種機制,這種機制提供了程序間通訊的通道,那麼為什麼加個system v呢,那是因為在system v 系統的四個版本中提出的程序通訊的ipc這種機制。所以叫做system v ipc。目前li...