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
comm.c#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
server.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;
}
#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形式呢?因為它省掉了兩次資料拷貝的過程。一旦這樣的記憶體對映到共享 他的程序的位址空間,這些程序間資料傳遞不在涉及到核心 就是程序不在通過執行進入核心的系統呼叫...