1. 程式人生 > >利用共享記憶體實現多程序互動

利用共享記憶體實現多程序互動

一、什麼是共享記憶體?

        共享記憶體(shared memory)是Unix下的多程序之間的通訊方法,這種方法通常用於一個程式的多程序間通訊,實際上多個程式間也可以通過共享記憶體來傳遞資訊。共享記憶體指在多處理器的計算機系統中,可以被不同中央處理器(CPU)訪問的大容量記憶體。由於多個CPU需要快速訪問儲存器,這樣就要對儲存器進行快取(Cache)。共享記憶體是存在於核心級別的一種資源,在shell中可以使用ipcs命令來檢視當前系統IPC中的狀態,在檔案系統/proc目錄下有對其描述的相應檔案。共享記憶體相比其他幾種方式有著更方便的資料控制能力,資料在讀寫過程中會更透明。

二、共享記憶體的介面API

Linux提供了一組函式介面用於使用共享記憶體,它們宣告在標頭檔案 sys/shm.h中。1、shmget函式該函式用來建立共享記憶體,它的原型為:
  1. int shmget(key_t key, size_t size, int shmflg);   

第一個引數,程式需要提供一個引數key(非0整數),它有效地為共享記憶體段命名,shmget函式成功時返回一個與key相關的共享記憶體識別符號(非負整數),用於後續的共享記憶體函式。呼叫失敗返回-1.shmget()  returns the identifier of the System V shared memory segment associated with the value of the argument key.  A  new  shared  memory  segment, with  size equal to the value of size rounded up to a multiple of PAGE_SIZE, is created if key has the value IPC_PRIVATE or  key  isn't  IPC_PRIVATE,  no shared  memory  segment corresponding to key exists, and IPC_CREAT is specified in shmflg.
不相關的程序可以通過該函式的返回值訪問同一共享記憶體,它代表程式可能要使用的某個資源,程式對所有共享記憶體的訪問都是間接的,程式先通過呼叫shmget函式並提供一個鍵,再由系統生成一個相應的共享記憶體識別符號(shmget函式的返回值),只有shmget函式才直接使用訊號量鍵,所有其他的訊號量函式使用由semget函式返回的訊號量識別符號。第二個引數,size以位元組為單位指定需要共享的記憶體容量第三個引數,shmflg是許可權標誌,它的作用與open函式的mode引數一樣,如果要想在key標識的共享記憶體不存在時,建立它的話,可以與IPC_CREAT做或操作。共享記憶體的許可權標誌與檔案的讀寫許可權一樣,舉例來說,0644,它表示允許一個程序建立的共享記憶體被記憶體建立者所擁有的程序向共享記憶體讀取和寫入資料,同時其他使用者建立的程序只能讀取共享記憶體。2、shmat函式
第一次建立完共享記憶體時,它還不能被任何程序訪問,shmat函式的作用就是用來啟動對該共享記憶體的訪問,並把共享記憶體連線到當前程序的地址空間。它的原型如下:
  1. void *shmat(int shm_id, constvoid *shm_addr, int shmflg);  
第一個引數,shm_id是由shmget函式返回的共享記憶體標識。第二個引數,shm_addr指定共享記憶體連線到當前程序中的地址位置,通常為空,表示讓系統來選擇共享記憶體的地址。第三個引數,shm_flg是一組標誌位,通常為0。呼叫成功時返回一個指向共享記憶體第一個位元組的指標,如果呼叫失敗返回-1.3、shmdt函式該函式用於將共享記憶體從當前程序中分離。注意,將共享記憶體分離並不是刪除它,只是使該共享記憶體對當前程序不再可用。它的原型如下:
  1. int shmdt(constvoid *shmaddr);    

引數shmaddr是shmat函式返回的地址指標,呼叫成功時返回0,失敗時返回-1.

4、shmctl函式

與訊號量的semctl函式一樣,用來控制共享記憶體,它的原型如下:
  1. int shmctl(int shm_id, int command, struct shmid_ds *buf);    
第一個引數,shm_id是shmget函式返回的共享記憶體識別符號。第二個引數,command是要採取的操作,它可以取下面的三個值 :    IPC_STAT:把shmid_ds結構中的資料設定為共享記憶體的當前關聯值,即用共享記憶體的當前關聯值覆蓋shmid_ds的值。    IPC_SET:如果程序有足夠的許可權,就把共享記憶體的當前關聯值設定為shmid_ds結構中給出的值
    IPC_RMID:刪除共享記憶體段
第三個引數,buf是一個結構指標,它指向共享記憶體模式和訪問許可權的結構。shmid_ds結構至少包括以下成員:
  1. struct shmid_ds  
  2. {  
  3.     uid_t shm_perm.uid;  
  4.     uid_t shm_perm.gid;  
  5.     mode_t shm_perm.mode;  
  6. };  

三、多程序互動得小專案實戰框架,原始碼在這個連結之中,需要請自行下載。

                http://download.csdn.net/download/sinat_34866256/10261546