1. 程式人生 > >程序間通訊:共享記憶體(程式碼實現)

程序間通訊:共享記憶體(程式碼實現)

共享記憶體:1.共享記憶體就是允許兩個不相關的程序訪問同一個邏輯記憶體;

                    2.共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種最有效的方式;

                    3.不同程序之間共享的記憶體通常安排為同一段實體記憶體;

                    4.共享記憶體不提供任何互斥和同步機制,一般用訊號量對臨界資源進行保護;

                    5.介面簡單

1.shmget:該函式用來建立共享記憶體


_key:程式需要提供一個引數key(非0整數),它有效地為共享記憶體段命名,shmget函式成功時返回一個與key相關的共享記憶體識別符號(非負整數),用於後續的共享記憶體函

             數。呼叫失敗返回-1。

_size:size以位元組為單位指定需要共享的記憶體容量。

shmflg:是許可權標誌,它的作用與open函式的mode引數一樣,如果要想在key標識的共享記憶體不存在時,建立它的話,可以與IPC_CREAT做或操作。共享記憶體的許可權標誌與

                檔案的讀寫許可權一樣,舉例來說,0644,它表示允許一個程序建立的共享記憶體被記憶體建立者所擁有的程序向共享記憶體讀取和寫入資料,同時其他使用者建立的程序只能讀

                取共享記憶體。

2.shmat:第一次建立完共享記憶體時,它還不能被任何程序訪問,shmat函式的作用就是用來啟動對該共享記憶體的訪問,並把共享記憶體連線到當前程序的地址空間。


shm_id:由shmget函式返回的共享記憶體標識。

shm_addr:指定共享記憶體連線到當前程序中的地址位置,通常為空,表示讓系統來選擇共享記憶體的地址。

shm_flg:是一組標誌位,通常為0。

3.shmdt:該函式用於將共享記憶體從當前程序中分離。注意,將共享記憶體分離並不是刪除它,只是使該共享記憶體對當前程序不再可用。


shmaddr:shmat函式返回的地址指標,呼叫成功時返回0,失敗時返回-1。

4.shmctl:用來控制共享記憶體


shm_id:shmget函式返回的共享記憶體識別符號。

command:要採取的操作,它可以取下面的三個值 :

    IPC_STAT:把shmid_ds結構中的資料設定為共享記憶體的當前關聯值,即用共享記憶體的當前關聯值覆蓋shmid_ds的值。

    IPC_SET:如果程序有足夠的許可權,就把共享記憶體的當前關聯值設定為shmid_ds結構中給出的值。

    IPC_RMID:刪除共享記憶體段。

buf:一個結構指標,它指向共享記憶體模式和訪問許可權的結構。

程式碼:

com.h:


com.c:



server.c:


client.h:


結果: