共享内存允许多个进程共享一给定的存储区。因为数据不需要在两个进程之间进行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的返回值。