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

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