linux下共享內存小結

1.共享內存的概念:
一個進程不能簡單的將自己的內存空間地址傳遞給其他進程使用,因爲linux操作系統的內存保護機制或者內存映射機制的限制。
在一個進程內,指向一塊內存的指針實際上是虛擬地址,而不是真正的物理內存地址,這個地址僅僅在當前進程內纔是有效使用的。
如果通過某種方式,實現多個進程訪問一塊物理內存,那麼進程之間的數據交換就可以通過讀寫內存來進行,這樣的通信方式具有更高的效率。
所以我們常說,共享內存時一種最爲高效的進程間通信方式。
注意:共享內存的方式並未提供同步機制,所以我們必須要負責實現共享內存的同步控制。
2.共享內存的使用:
(1)調用shmget函數,創建共享內存
(2)映射共享內存,使用shmat函數
(3)使用完畢後,撤銷映射,使用函數shmdt。
3.shmget函數:
使用shmet函數來創建共享內存:
#include <sys/types.h>
#inlcude <sys/ipc.h>
#inlcude <sys/shm.h>
int shmget(key_t key,size_t size,int shmflg);
參數key,是一個鍵值,多個進程可以由這個鍵值訪問同一個共享內存。當指定特殊值,IPC_PRIVATE,說明創建了只有當前進程可以訪問的共享內存。
shmget函數返回一個共享內存標識符,用於後續的共享內存函數。
參數size的大小指定了這塊共享內存的大小。
shmflg作用與創建文件時設定的權限標誌mode一樣。
4.shmat函數
第一次創建共享內存段時,它不可以被任何進程訪問,要想啓用對該內存的訪問,必須將其連接到一個進程的地址空間內。
#include <sys/types.h>
#inlcude <sys/shm.h>
#include <sys/ipc.h>
void *shmat(int shmid,const void *shmaddr,int shmflg);
shmid是先前創建共享內存發回的內存標識符。
shmaddr指定共享內存連接到當前進程中的地址位置,它通常設爲0,由系統來選擇共享內存所出現的最佳地址。
shmflg是一組位標誌。(設定SHM_RDONLY,表示共享內存只讀。默認0.表示共享內存可讀可寫。)
若shmat調用成功,則它返回一個指向共享內存的第一個字節的指針。即被映射的段地址。
5.shmdt函數
其作用是將共享內存從當前進程中分離.
#include <sys/types.h>
#inlcude <sys/shm.h>
int shmat(const void *shmaddr);
參數shmaddr是shmat返回的指針。
將共享內存分離斌不是刪除它,只是使得該共享內存對於當前的進程不再可用了。
5.shmctl函數
#inlcude <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
shmid是shmget返回的內存共享標誌符。
cmd是需要採取的動作:
(1)IPC_STAT:把shmid_ds結構中的數據設置爲共享內存的當前關聯值
(2)IPC_SET:如果有足夠的權限,就把共享內存的當前關聯值設置爲shmid_ds結構中給出的值。
(3)IPC_RMID:刪除共享內存段
buf是一個指針,它指向包含共享內存模式和訪問權限的結構。


例子參看代碼類。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章