共享内存可实现进程间大量数据传输,共享内存相对于管道通信,因为不涉及用户态内核态切换,效率很高。
1、使用shmget函数创建共享内存:
//from /usr/include/sys/shm.h
int shmget(key_t key,size_t size,int shmflag);
函数第1个参数为由ftok()产生的键值。第2个参数为要创建的共享内存大小,第3个参数为共享内存的属性,包含以下选项:
//from /usr/include/bit/ipc.h
#define IPC_CREAT 00001000 //如果key值不存在则创建
#define IPC_EXCL 00002000 //如果key存在,则返回失败
#define IPC_NOWAIT 00004000 //如果需要等待时,直接返回错误
#define SHM_R 0400 // 可读
#define SHM_W 0200 //可写
2、使用shmctl函数控制共享内存:
//from /usr/include/sys/shm.h
int shmctl(int shmid,int cmd,struct shmid_ds* buf);
函数第1个参数为共享内存标识符,第2个参数为要执行的参数,选项包括:
//from /usr/include/linux/ipc.h
#define IPC_RMID 0 // 立即删除消息队列
#define IPC_SET 1 // 设置buf中的消息队列属性
#define IPC_STAT 2 // 获取消息队列的属性并保存在buf中
#define IPC_INFO 3 // 获取限制信息
//from /usr/include/sys/shm.h root权限
#define SHM_LOCK 11 //锁定共享内存
#define SHM_UNLOCK 12 //解锁共享内存
3、使用shmat函数映射共享内存:
//from /usr/include/sys/shm.h
void * shmat(int shmid,void* shmaddr,int flag);
函数第1个参数为共享内存标识符,第2个参数指定共享内存的映射首地址,为0,则表示由系统自行映射。第3个参数用来指定共享内存的访问权限及映射条件:
//from /usr/include/linux/shm.h
#define SHM_RDONLY 010000 //只读
...
4、使用shmdt函数分离共享内存:
//from /usr/include/sys/shm.h
int shmdt(void* shmaddr);