共享内存
首先应该清楚,共享内存是进程共享数据最快的一种方法,同样这也表明了它的不安全性因素。
一、获得创建共享内存
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t shmid,size_t size,int shmflg);
key 0(IPC_PRIVATE):会建立新共享内存对象,大于0的32位整数:视参数shmflg来确定操作。通常要求此值来源于ftok返回的IPC键值
size 大于0的整数:新建的共享内存大小,以字节为单位 ;只获取共享内存时指定为0
shmflg 0:取共享内存标识符,若不存在则函数会报错
IPC_CREAT:当shmflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符
IPC_CREAT|IPC_EXCL:如果内核中不存在键值与key相等的共享内存,则新建一个消息队列;如果存在这样的共享内存则报错
此函数得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符。
二、映射共享内存
#include <sys/types.h>
#include <sys/shm.h>
char *shmat(int shmid,char *shmaddr,int shmflg);
at表示attach。由此可见,此函数的作用为将标示符为shmid的共享内存映射到当前运行的进程中。
换句话说就是进程连接共享内存。返回的是映射的共享内存的地址。
shmaddr 指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置。
shmflg SHM_RDONLY:为只读模式,其他为读写模式 。
三、断开共享内存
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(char *shmaddr);
shmaddr为连接共享内存的起始地址,对比shmat里参数即知。返回0为成功。
注意此函数只是进程断开与共享内存的连接,而不是删除。当然,若是进程结束,则自动断开连接。