IPC共享内存 shm

共享内存是最快的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 的最小整数


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值