共享儲存允許兩個或更多程序共享一給定的儲存區。因為資料不需要在客戶程序和伺服器程序之間複製,所以這是最快的一種ipc。使共享儲存時要掌握的唯一敲門時多個程序之間對一給定儲存區的同步訪問。若伺服器程序在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應當去取這些資料。通常,訊號量被用來實現對共享儲存訪問的同步。
int shmget(key_t key, size_t size, int flag);
返回值:
若成功則返回共享儲存id,若出錯則返回-1
引數: key:通過ftok返回的值;
size:共享記憶體的大小,單位位元組;
flag:ipc_cret | 0666
一旦程序建立了乙個共享儲存段,就可呼叫shmat
void *shmat(int shmid, const void* addr, int flag);
返回值:
若成功返回指向共享儲存的指標,若出錯則返回-1
共享儲存段連線到呼叫程序的那個位址上與addr引數以及在flag中的是否制定shm_rnd位有關。
引數: shmid:呼叫shmget返回的共享記憶體id;
addr:
2.如果addr非null,並且沒有指定shm_rnd,則此段連線到addr所指定的位址上。
3.如果aaddr非null,並且指定了shm_rnd,則此段連線到(addr-(addr mod ulus shmlba))所表示的位址上。shm_rnd命令的意思是「取整」。shmlba的意思是「低邊界位址倍數」,他總是2的乘方、該算式時將位址向下取最近乙個shmlba的數。除非只計畫在一種硬體上執行應用程式(這在當今是不大可能的),否則不用指定共享段所連線到的位址。所以一般應指定shmaddr為0,以便由核心選擇位址。
flag: 如果在flag中指定了shm_rdonly位,則以唯讀方式連線此段,否則以讀寫的方式連線此段shmat返回值是該段所連線的實際位址 如果出錯返回-1
int shmdt(void *addr);
返回值:
若成功返回0,若出錯返回-1
引數: addr:為以前呼叫shmat時的返回值。
作用:當共享儲存段的操作已經結束,則呼叫shmdt脫接該段。注意,這並不從系統中刪除其識別符號以及其資料結構。該識別符號仍然在,直至某個程序(一般是伺服器)呼叫shmtcl(帶命令ipc_rmid)特地刪除它。
Linux程序間通訊 共享記憶體
共享記憶體是執行在同一臺機器上的程序間通訊最快的方式,因為資料不需要在不同的程序間複製。通常由乙個程序建立一塊共享記憶體區,其餘程序對這塊記憶體區進行讀寫。共享記憶體往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。首先要用的函式是shmget,它獲得乙個共享儲存識別符號。i nclu...
Linux程序間共享記憶體通訊
使用共享記憶體基本分四個步驟 獲得共享記憶體 shmget 對映共享記憶體shmat 解除對映shmdt 刪除共享記憶體shmctl 於是自己在網上找來了乙個例子看了下,並且用虛擬機器單獨跑了下共享記憶體的經典例程看了下,才知道了自己的問題出現 了 發現有時候只要自己親自將程式一步一步的去測,才知道...
Linux程序間通訊 共享記憶體
之前提到了程序間通訊的管道,訊息佇列,訊號量,然後其中訊號量是pv操作,操控的是乙個共享資源。在我們提到的ipc模組中,訊息佇列針對的是資料單元的資訊傳送,管道不屬於system v ipc的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...