程序間通訊之共享記憶體

2021-07-29 16:20:10 字數 2114 閱讀 6517

1.概念:

共享記憶體就是多個程序的位址空間對映到同乙個物理記憶體,多個程序都能看到這塊物理記憶體,共享記憶體可以提供給伺服器程序和客戶程序之間進行通訊,不需要進行資料的複製,所以速度最快。

2.共享記憶體操作需要的函式:

(1)我們需要利用ftok函式生成key識別符號。

key_t ftok(const char *pathname,int proj_id).

(2)我們使用shmgt函式,建立乙個共享記憶體塊,返回這個共享記憶體塊的識別符號shmid。

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

size是需要申請的共享記憶體的大小,需要注意的是,作業系統為你提供的大小的時候是按頁來提供,所以size為4k的整數倍,

shm***:如果要建立新的共享記憶體,那麼就使用ipc_creat,ipc_excl,如果是已經存在的,那麼只需要使用ipc_creat。

(3)用shmat掛接共享記憶體(將程序位址空間掛接到共享記憶體,共享記憶體是物理空間,可以有多個掛接)

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

shmid是掛接的程序號,

shmaddr置為null,讓系統選擇乙個合適的位址空間進行掛接

shm***表示什麼方式進行掛接,一般都是取0.

函式返回各個程序掛接的虛擬的位址空間。

(4)用shmdt去掛接。

int shmdt(const void *shmaddr);

(5)用shmctl銷毀共享記憶體

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

cmd取ipc_rmid表示刪除這塊共享記憶體

buf一般設定為null,不關心這個東西,訊息佇列中也有這麼乙個類似的結構體也是設定為null.

3.**實現:

下面的例子是伺服器程序進行建立共享記憶體,然後掛接,客戶程序也掛接,然後伺服器程序每2秒寫入乙個字元,

客戶程序也接收到,列印,實現記憶體共享

comm.h

#ifndef _comm_h_

#define _comm_h_

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

#define proj_id 0x6666

int creat_shm(size_t size);

int get_shm();

int destroy_shm(int shmid);

#endif

comm.c

#include"comm.h"

int common(size_t size,int flags)

int shmid = shmget(key,size,flags);//得到共享記憶體的識別符號shmid。

if (shmid < 0)

return shmid;

}int creat_shm(size_t size)

int get_shm()

int destroy_shm(int shmid)

return 0;

}

server.c

#include"comm.h"

int main()

shmdt(buf); //去掛接。

程序間通訊之共享記憶體

此程式實現兩個普通程序間通過共享記憶體來進行通訊,共享記憶體能夠進行大資料量的通訊,這一點事訊息佇列無法比擬的。在這裡同時使用了訊號量來保證兩個程序間的讀寫同步。傳送端源 include include include include include include include include ...

程序間通訊之共享記憶體

ipc物件這個概念需要理解,因為好多書或者料就直接說ipc就是共享記憶體 訊息佇列 訊號燈集,其實ipc是一種機制,這種機制提供了程序間通訊的通道,那麼為什麼加個system v呢,那是因為在system v 系統的四個版本中提出的程序通訊的ipc這種機制。所以叫做system v ipc。目前li...

程序間通訊之共享記憶體

繼學習過程序間通訊的兩種方式管道和訊息佇列之後,接下來就要學習乙個速度最快的 程序間通訊的方式 共享記憶體。為什麼說共享記憶體是最快的ipc形式呢?因為它省掉了兩次資料拷貝的過程。一旦這樣的記憶體對映到共享 他的程序的位址空間,這些程序間資料傳遞不在涉及到核心 就是程序不在通過執行進入核心的系統呼叫...