共享內(nèi)存允許多個進(jìn)程共享一給定的存儲區(qū)。因為數(shù)據(jù)不需要在兩個進(jìn)程之間進(jìn)行copy,所以這是最快的一種IPC。使用共享內(nèi)存技術(shù)的時候,需要掌握好的是多個進(jìn)程之間如何同步。信號量和記錄鎖可以用來實現(xiàn)共享內(nèi)存的多個進(jìn)程之間的同步。
linux內(nèi)核定義的shared memory結(jié)構(gòu)shmid_ds如下:
struct shmid_ds {
struct ipc_perm shm_perm; /*權(quán)限*/
size_t shm_segsz; /*大小*/
pid_t shm_lpid;
pid_t shm_cpid; /*創(chuàng)建者pid*/
shmatt_t shm_nattch;/*連接到此段內(nèi)存的進(jìn)程數(shù)*/
time_t shm_atime;
time_t shm_dtime;
time_t shm_ctime;

};
1、創(chuàng)建或使用一段共享內(nèi)存使用shmget函數(shù),此函數(shù)將返回共享內(nèi)存標(biāo)示符。
#include <sys/shm.h>
int shmget(key_t key, size_t size, int flag);
如果key取值為IPC_PRIVATE或者key當(dāng)前為和特定類型的IPC結(jié)構(gòu)相結(jié)合,并且flag指定了IPC_CREAT位,則創(chuàng)建一個新的share memory結(jié)構(gòu)。
size為共享內(nèi)存段的長度(字節(jié))。
2、對一個共享內(nèi)存段進(jìn)行操作使用shmctl。
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmid指定需要操作的shared memory
cmd指定需要進(jìn)行的操作
IPC_STAT取得此段的shmid_ds結(jié)構(gòu)放入buf中。
IPC_SET用buf的值設(shè)置此段中的:shm_perm.uid,shm_perm.gid,shm_perm.mode。
IPC_RMID從系統(tǒng)中刪除此共享內(nèi)存段。
SHM_LOCK將共享內(nèi)存鎖定到內(nèi)存中。
SHM_UNLOCK解鎖共享內(nèi)存段。
3、將一個共享內(nèi)存段連接到自己的地址空間使用shmat:
#include <sys/shm.h>
void *shmat(int shmid, const void *addr, int flag);
推薦addr取0值,將此段連接到內(nèi)核選擇的第一個可用的地址上。增加程序的可移植性。
4、對共享內(nèi)存操作結(jié)束后,要脫離該段用shmdt:
#include <sys/shm.h>
int shmdt(void *addr);
addr是shmat的返回值。