程序間通訊之共享記憶體

2021-08-17 11:54:02 字數 2713 閱讀 8646

繼學習過程序間通訊的兩種方式管道和訊息佇列之後,接下來就要學習乙個速度最快的

程序間通訊的方式——共享記憶體。

為什麼說共享記憶體是最快的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

#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;

}

comm.h

#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

server.c

#include "comm.h"

int main()

shmdt(addr);

sleep(5);

destroy(shmid);

return 0;

}

client.c

#include "comm.h"

int main()

shmdt(addr);

sleep(1);

return 0;

}

makefile

.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...