程序間通訊(三)之共享記憶體

2021-09-25 15:21:29 字數 2329 閱讀 5724

上接程序間通訊(二)

四、共享記憶體

共享記憶體也稱共享儲存,共享記憶體就是指允許兩個或多個程序共享一定的儲存區。因為資料不需要客戶程序和伺服器程序之間複製,所以說共享記憶體時最快的一種ipc。使用共享記憶體時要掌握的唯一要點,就是多個程序之間對一定儲存區的同步訪問。若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應該去取這些資料。通常,訊號量被用來實現對共享記憶體的同步訪問。(當然記錄鎖也可用於這種場合)

核心為每個共享儲存段設定了乙個shmid_ds結構;

struct shmid_ds ;
(按照支援共享儲存段的需要,每種實現會在shmid_ds結構中增加其他成員。)

shmatt_t 型別定義為不帶符號整型,它至少與unsigned short一樣大。

為了獲取乙個共享儲存標識,呼叫的第乙個函式通常是shmget()。

#includeint shmget(key_t key,size_t size,int flag); //成功返回共享儲存的id,出錯返回-1
當建立乙個新的共享儲存段時,初始化shmid_ds結構的下列成員:

·ipc_perm結構中的mode成員按flag中的相應許可權位設定。

·shm_lpid、shm_nattach、shm_stime、以及shm_dtime都設定為0.

`shm_ctime設定為當前時間。

·shm_segsz設定為請求的長度(size)。

引數size是該共享儲存段的長度(單位:位元組)。實現通常將其向上取為系統頁長的整數倍。但是,若應用指定的size值並非系統頁長的正數倍,那麼最後一頁的餘下部分是不可能使用的。如果正在建立乙個新段(一般在伺服器程序中),則必須指定size。如果正在引入乙個現存的段(乙個客戶程序),則將size指定為0。當建立一新段時,段內的內容初始化為0。

shmctl()函式對共享記憶體段執行多種操作。

#includeint shmctl(int shmid,int cmd,struct shmid_ds *buf);//成功返回0,出錯返回-1
cmd引數指定下列5中命令中的一種,使其在shmid指定的段上執行。

ipc_stat     取此段的shmid_ds結構,並將它存放在由buf指向的結構中。

ipc_set       按buf指向結構中的值設定與此段相關結構中的下列三個字段:shm_perm.uid、shm_perm.gid以及shm_perm.mode。此命令只能由下列兩種程序執行:一種是其有效使用者id等於shm_perm.cuid或shm_perm.uid的程序;另一類是具有超級使用者特權的程序。

linux和solaris提供了下列兩種命令,unix中並沒有。

shm_lock         將共享儲存段鎖定在記憶體中。此命令只能超級使用者執行。

shm_unlock    解鎖共享儲存段。此命令只能由超級使用者執行。

一旦建立了乙個共享儲存空段,程序就可呼叫shmat將其連線到它的位址空間中。

#includevoid *shmat(int shmid,const void *addr,int flag);//若成功返回該共享儲存段的指標,出錯返回-1
共享儲存段連線到呼叫程序的哪個位址與addr引數以及在flag中是否制定shm_rnd位有關。

·如果addr非0,並且沒有指定shm_rnd,則次段連線到addr指定的位址上。

·如果addr非0,並且指定了shm_rnd,則此段連線到(addr-(addr mod ulus shmlba))表示的位址上。shn_rnd命令的意思是「取整」。shmlba的意思是「低邊界位址倍數」,它總是2的乘方。該算式是將位址向下取最近乙個shmlba的倍數。

除非只計畫在一種硬體上執行應用程式,否則不應該指定共享段所連線到的位址。所以一般應指定addr為0,以便由核心選擇位址。

如果在flag中指定了shm_rdonly位,則以唯讀方式連線此段。否則以讀寫方式連線此段。

shmat()的返回值是該段所連線的實際位址,如果出錯返回-1。如果shmat執行成功,那麼核心將使該共享儲存段shmid_ds結構中的shm_nattch計數器值加1。

當共享儲存段的操作已經結束時,則呼叫shmdt()脫接該段。注意,這並不是從系統中刪除其識別符號以及其資料結構,該識別符號仍然存在,直至某個程序(一般是伺服器程序)呼叫shmctl()(帶命令ipc_rmid)特地刪除它。

#includeint shmdt(void *addr); //成功返回0,出錯返回-1
addr引數是以前呼叫shmat時的返回值。如果成功,shmdt將使其相關shmid_ds結構中的shm_nattch計數器值減1。

程序間通訊 三 共享記憶體

共享記憶體是linux下倆程序通訊的一種方式,主要功能是讓兩個程序的虛擬位址都對映到同一片實體地址上,就可以通過這片實體地址進行資料的互動 mmap函式要求核心建立乙個新的虛擬記憶體區域,最好是從位址start開始的乙個區域,並將檔案描述符df指定的物件的乙個連續的片對映到這個新的區域,連續的物件片...

程序間通訊(三) 共享記憶體

共享記憶體區是最快的ipc形式。一旦這樣的記憶體對映到共享他的程序的位址空間,這些程序間資料傳遞不再涉及到核心,換句話說就是程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料。共享記憶體示意圖 共享記憶體資料結構 struct shmid ds 相關函式shmget函式 建立共享記憶體 int sh...

程序間通訊之共享記憶體

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