所有的函式共用標頭檔案
#include
#include
#include
3.1建立共享記憶體——>shmget() 函式
int
shmget
(key_t key, size_t size, int shm***)
;
//成功返回共享記憶體的id,出錯返回-1
(1)第乙個引數key是長整型(唯一非零),系統建立ipc通訊 ( 訊息佇列、 訊號量和 共享記憶體) 時必須指定乙個id值。通常情況下,該id值通過ftok函式得到,由核心變成識別符號,要想讓兩個程序看到同乙個訊號集,只需設定key值不變就可以。
(2)第二個引數size指定共享記憶體的大小,它的值一般為一頁大小的整數倍(未到一頁,作業系統向上對齊到一頁,但是使用者實際能使用只有自己所申請的大小)。
(3)第三個引數shm***是一組標誌,建立乙個新的共享記憶體,將shm*** 設定了ipc_creat標誌後,共享記憶體存在就開啟。而ipc_creat | ipc_excl則可以建立乙個新的,唯一的共享記憶體,如果共享記憶體已存在,返回乙個錯誤。一般我們會還或上乙個檔案許可權
3.2操作共享記憶體———>shmctl()函式
int
shmctl
(int shm_id, int cmd, struct shmid_ds *buf)
;
//成功返回0,出錯返回-1
(1)第乙個引數,shm_id是shmget函式返回的共享記憶體識別符號。
(2)第二個引數,cmd是要採取的操作,它可以取下面的三個值 :
ipc_stat:把shmid_ds結構中的資料設定為共享記憶體的當前關聯值,即用共享記憶體的當前關聯值覆蓋shmid_ds的值。
ipc_set:如果程序有足夠的許可權,就把共享記憶體的當前關聯值設定為shmid_ds結構中給出的值
ipc_rmid:刪除共享記憶體段
(3)第三個引數,buf是乙個結構指標,它指向共享記憶體模式和訪問許可權的結構。 shmid_ds結構至少包括以下成員
struct
shmid_ds
; 建立共享儲存段之後,將程序連線到它的位址空間
void *shmat
(int shm_id, const
void *shm_addr, int shm***)
;
//成功返回指向共享儲存段的指標,出錯返回-1
(2)第二個引數,shm_addr指定共享記憶體連線到當前程序中的位址位置,通常為空,表示讓系統來選擇共享記憶體的位址。
(3)第三個引數,shm_***是一組標誌位,通常為0
該操作不從系統中刪除識別符號和其資料結構,要顯示呼叫shmctl(帶命令ipc_rmid)才能刪除它
int
shmdt
(const
void *shmaddr)
;
//成功返回0,出錯返回-1
(1)addr引數是以前呼叫shmat時的返回值
通過檢視共享記憶體狀態可以知道作業系統提供給使用者的共享記憶體為4097個位元組,實際上作業系統開闢了8k個位元組,而且由於接收方client還沒掛接,所以掛接數為1。
執行結果:
共享記憶體中的資料並不會像管道或者訊號量等被一端讀取之後就不存在。
優點:我們可以看到使用共享記憶體進行程序間的通訊真的是非常方便,而且函式的介面也簡單,資料的共享還使程序間的資料不用傳送,而是直接訪問記憶體,也加快了程式的效率。同時,它也不像匿名管道那樣要求通訊的程序有一定的父子關係(system v版本共有)。
缺點:共享記憶體沒有提供互斥同步的機制,這使得我們在使用共享記憶體進行程序間通訊時,往往要借助其他的手段比如訊號量等來進行程序間的同步工作。
程序間通訊方式——訊息佇列
程序間通訊方式——訊號量(semaphore)
程序間的通訊方式——pipe(管道)
程序間通訊 共享記憶體
下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...
程序間通訊 共享記憶體
共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體實現分兩個步驟 建立共享記憶體,使用shmget函式 對映共享記憶體,使用shmat函式 共享記憶體是一種最為高...
程序間通訊 共享記憶體
共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...