基本用法看man文档
1. shmget,shmflg指定IPC_EXCL位
A. 如果key对应的共享内存已经存在,则返回-1,并且置errno为EEXIST错误;此时需要重新shmget一下并且shmflg不置IPC_EXCL位
B. 否则如果key对应的共享内存不存在:
如果size大于已存在共享内存容量,则返回-1并置errno为EINVAL,此时需要删除旧共享内存并重新申请(申请时序先shmget 一下,参数size置1, 目的是获取旧共享内存的shmid,共shmctl删除使用)
如果size小于等于共享内存容量,分配成功(如果在这一步分配失败,则可通过error值确定原因)
2. shmctl。
shmctl删除共享内存时首先要获取共享内存id,方法见上。
测试:
1. a进程创建一块大小为8的共享内存,并进入死循环(目的是关联该共享内存,使下面的nattch不为0)
# ./a
# ipcs -m
----- Shared Memory Segments --------
key shmid owner perms bytes nattch
status
0x000214bc 1933313 root 666 8 1
2. c进程key与a进程相同,创建大小为1024共享内存,发现已存在共享内存(a进程创建)容量太小,则删除旧共享内存,并重新创建。
# ./c
# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 1933313 root 666 8 1 dest
0x000214bc
1966082 root 232 1024 0
可以看出a进程创建共享内存所用key值已经从0x000214bc 变成0x00000000,并且status变成dest状态,这是由于c进程的shmctl在删除旧共享内存时,内核发现该共享内存的nattch为1(也就是有进程关联在该共享内存上,此处为a进程,因为死循环),内核就会置key为IPC_PRIVATE并置status为dest,这就保证该共享内存成为唯一的,dest状态会保证在关联进程(此处为a进程)终止时,该共享内存会被内核删除回收,而c进程创建的共享内存的key值依然是0x000214bc 。
3. key值为IPC_PRIVATE
IPC_PRIVATE会保证创建唯一的共享内存,多个进程都可以用IPC_PRIVATE创建自己特有的共享内存。
测试如下图
# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 1933313 root 666 8 1 dest
0x000214bc 1966082 root 232 1024 0
0x00000000 1998851 root 232 1 0
0x00000000 2031620 root 232 1 0
0x00000000 2064389 root 232 1 0