共享内存是最快的IPC
检查共享内存:ipcs m | grep "name"
删除共享内存:ipcrm m "共享内存ID号"
==========================
测试一:
启动两个程序,创建打开同一块共享内存,
查看一下共享内存情况如下:
root@PLATDEV:~# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00005feb 0 root 666 12000 3
0x00005fe7 32769 root 666 524288 2
0x00005fe8 65538 root 666 2097152 1
0x00004321 131075 root 644 40964 0
0x00004333 327684 root 644 16539 0
0x0000433f 458757 root 644 16539 0
0x000000c8 655367 root 644 1024 2
root@PLATDEV:~# ipcrm -m 655367 <------- 通过ipcrm删除该shm
root@PLATDEV:~# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00005feb 0 root 666 12000 3
0x00005fe7 32769 root 666 524288 2
0x00005fe8 65538 root 666 2097152 1
0x00004321 131075 root 644 40964 0
0x00004333 327684 root 644 16539 0
0x0000433f 458757 root 644 16539 0
0x00000000 655367 root 644 1024 2 dest <-------- 注意: (1)该shm key已经变为 0x0 (2)该 shm 的status 已经变成 dest
(3)之前attach 多少进程依然不变
关闭一个进程后:
root@PLATDEV:~# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00005feb 0 root 666 12000 3
0x00005fe7 32769 root 666 524288 2
0x00005fe8 65538 root 666 2097152 1
0x00004321 131075 root 644 40964 0
0x00004333 327684 root 644 16539 0
0x0000433f 458757 root 644 16539 0
0x00000000 655367 root 644 1024 1 dest
关闭另一个一个进程后, 共享内存被删除
root@PLATDEV:~#
root@PLATDEV:~# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00005feb 0 root 666 12000 3
0x00005fe7 32769 root 666 524288 2
0x00005fe8 65538 root 666 2097152 1
0x00004321 131075 root 644 40964 0
0x00004333 327684 root 644 16539 0
0x0000433f 458757 root 644 16539 0
测试二:
延续上面的测试到
root@PLATDEV:~# ipcrm -m 655367 <------- 通过ipcrm删除该shm
root@PLATDEV:~# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00005feb 0 root 666 12000 3
0x00005fe7 32769 root 666 524288 2
0x00005fe8 65538 root 666 2097152 1
0x00004321 131075 root 644 40964 0
0x00004333 327684 root 644 16539 0
0x0000433f 458757 root 644 16539 0
0x00000000 655367 root 644 1024 2 dest <-------- 注意: (1)该shm key已经变为 0x0 (2)该 shm 的status 已经变成 dest
(3)之前attach 多少进程依然不变
这个时候再启动一个进程,这个时候会发现这个进程会按照shm key 创建全新的shm (原来的shm key已经清零了, 所以新创建的shm会创建成功)
key shmid owner perms bytes nattch status
0x00005feb 0 root 666 12000 3
0x00005fe7 32769 root 666 524288 2
0x00005fe8 65538 root 666 2097152 1
0x00004321 131075 root 644 40964 0
0x00004333 327684 root 644 16539 0
0x0000433f 458757 root 644 16539 0
0x00000000 655367 root 644 1024 2 dest
0x000000c8 655367 root 644 1024 1 <-------- 这里
=======================================
【注意1】:
共享内存的创建和打开和 用户权限有很大关系, 1个用户不能打开其他用户创建的共享内存(甚至是root 用户)
owner: 创建者
perms: 权限设置
在创建共享内存的时候其中有个参数很重要,用作权限设置,
S_IRUSR 0400 创建用户有读权限
S_IWUSR 0200 创建用户有写权限
S_IRGRP 0040 创建用户所属用户组有读权限
S_IWGRP 0020 创建用户所属用户组有写权限
S_IROTH 0004 其他用户有读权限
S_IWOTH 0002 其他用户有写权限
使用用户chaos 登录,创建共享内存 0x00000100 权限0644
切换用户为xcp
打开该共享内存都会失败
修改方法: 权限设置为 0666 就可以了
【注意2】:
原来共享内存权限是 0644(注意是 8进制 ), 后面open 这个共享内存并把权限修改为 0666 实际是不会生效的, 需要删除后重新创建,
说到底就是已经创建的共享内存不能对他的参数做任何修改操作, 除非删除后重新创建。
【注意3】:
创建共享内存的大小较小, 但是往里面写的数据溢出,需要重点注意,
因为溢出数据会写到进程的其他映射的空间,造成在访问这些空间的时候出现不可预知的异常。
=====================================
参考: http://user.qzone.qq.com/89617663/blog/1318849395#!app=2&via=QZ.HashRefresh&pos=1318849395
=====================================
共享内存系统参数(单位:字节)
kernel.shmmni = 4096 ------ SHMMNI 表示 内共享内存段的最大数量。该参数的默认值是 4096
kernel.shmall = 524288 ------ SHMALL 表示整个系统共享内存总量(以页为单位)。 该参数的值始终应该至少为:ceil(SHMMAX/PAGE_SIZE)
kernel.shmmax = 1073741824*2 ----- SHMMAX 表示整个系统共享内存总量(以字节为单位, 默认值是 32MB )。 一般使用下列方法之一种将 SHMMAX 参数设为 2GB
# getconf PAGESIZE
4096
ceil(expr) : 返回大于或者等于 expr 的最小整数
floor(expr) : 返回小于或者等于 expr 的最小整数