程序間通訊 共享記憶體

2021-08-02 05:49:46 字數 2585 閱讀 9290

系統v的ipc通訊機制包括了訊息佇列、共享記憶體和訊號量。每一種ipc結構結構都有乙個非負整數標誌,當建立乙個ipc結構時,呼叫程序都必須提供乙個型別為key_t的鍵(key)。作業系統把這個鍵轉換為乙個ipc的唯一識別符號。

可以使用以下方式來指定乙個鍵,呼叫函式如下:

#include 

#include

key_t ftok(const

char* path, int projectid);

建立好以後就可以使用這個鍵去建立乙個新的ipc結構了。伺服器只需要呼叫合適的get函式去建立就好了。這裡我們主要談論共享記憶體。

顧名思義,通過共享一塊記憶體空間,其他程序不需要進行讀取操作就可以看到乙份公共資源,從而進行相互交換資訊,但是共享記憶體之中不提供同步與互斥機制,這就需要我們使用者自己去設計,簡單的就是執行pv操作了。

要使用乙個共享記憶體段,程序就必須獲得該共享記憶體段的標誌符,這裡可以使用shmget函式,原始碼如下:

#include 

#include

#include

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

引數size指定了共享記憶體段的大小,建議制定為頁的整數倍,引數key制定了該共享記憶體段使用的key,可以使用ftok得到,引數shm***可以設定為ipc_creat和ipc_excl,兩個同時設定代表

如果共享記憶體段不存在則建立,如果存在則返回乙個識別符號,只使用ipc_creat時代表共享記憶體段存在則開啟,不存在則返回-1,同時將失敗原因儲存在errno中。

建立了乙個共享記憶體段後就要對他進行一系列的操作,比如,刪除。這裡就要使用shmctl函式:

#include 

#include

#include

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

引數shmid包括了共享記憶體段的識別符號,引數buf指向乙個型別為struct_ds的結構體,定義了記憶體段的性質:

struct shmid_ds ;
引數cmd可以設定為ipc_rmid,表示從系統中刪除shmid指定共享記憶體段的識別符號,並刪除相應的資料結構。

#include 

#include

#include

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

引數shmid指定了要連線的共享記憶體段的識別符號;

引數shmaddr指定了共享記憶體的位址,一般設定為0,表示由系統選擇,因為系統是最了解位址的;

引數shm***包括了常量shm_rdonly,那麼記憶體段就是唯讀的,否則就是讀寫的,如果成功連線,返回開始位址,否則返回(void*)-1,同時將失敗原因儲存在errno中。

在使用完共享記憶體段以後,程序可以使用shmdt來斷開連線;

#include 

#include

#include

void *shmdt(void* shmaddr);

引數是shmat的返回值。

二.共享記憶體**

//標頭檔案comm.h

#ifndef _comm_h_

#define _comm_h_

#include

#include

#include

#define pathname "."

#define proj_id 0x6666

int creatshm(int size); //共享記憶體的建立

int destroyshm(int shmid);//共享記憶體的銷毀

int getshm(int size); //共享記憶體獲取

#endif //_comm_h_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 destroyshm(int shmid)

return0;}

int getshm(int

size)

/

#include "comm.h"

int main()

shmdt(addr); //斷開連線

destroyshm(shmid); //銷毀共享記憶體

return

0;}

#include "comm.h"

int main()

shmdt(addr); //斷開連線

return

0;}

程序間通訊 共享記憶體

下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...

程序間通訊 共享記憶體

共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體實現分兩個步驟 建立共享記憶體,使用shmget函式 對映共享記憶體,使用shmat函式 共享記憶體是一種最為高...

程序間通訊 共享記憶體

共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...