共享内存分为四部分
shmget shmat shmde shmctl
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据
1 shmget()函数
int shmget(key_t key,size_t sizie,int shmflg);
key :这个共享内存段的名字 size_t size 共享内存的带下
shmflg 一般是 IPC_CREATE|IPC_EXCL|0644 :0644是权限
IPC_CREAT 如果仅仅是这个就是如果有这个共享内存了就打开 加上IPC_EXCL 如果有就报错
该函数成功返回共享内存段的标识码
一般我们可以用 ftok()函数来获取这个key;
shmat(int shmid,const void *shmaddr)
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数
shmid: 共享内存标识
shmaddr:指定连接的地址
shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1
shmdt:
功能:将共享内存段与当前进程脱离
原型
int shmdt(const void *shmaddr);
参数
shmaddr: 由shmat所返回的指针
返回值:成功返回0;失败返回-1
注意:将共享内存段与当前进程脱离不等于删除共享内存段
shmctrl
功能:用于控制共享内存
原型
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数
shmid:由shmget返回的共享内存标识码
cmd:将要采取的动作(有三个可取值)一般是IPC_RMID
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
返回值:成功返回0;失败返回-
代码实现: