linux共享内存 dest,详解Linux共享内存的管理

在进程通信应用中会用到共享内存,这就涉及到了IPC,与IPC相关的命令包括:ipcs、ipcrm(释放IPC)。IPCS命令是Linux下显示进程间通信设施状态的工具。我们知道,系统进行进程间通信(IPC)的时候,可用的方式包括信号量、共享内存、消息队列、管道、信号(signal)、套接字等形式[2]。使用IPCS可以查看共享内存、信号量、消息队列的状态。

当下系统是Ubuntu Linux 18.04,执行ipcs命令查看

linuxidc@linuxidc:~/linuxidc.com$ ipcs

--------- 消息队列 -----------

键        msqid      拥有者  权限    已用字节数 消息

------------ 共享内存段 --------------

键        shmid      拥有者  权限    字节    连接数  状态

0x00000000 393217    linuxidc  600        524288    2          目标

0x00000000 425986    linuxidc  600        524288    2          目标

0x00000000 458755    linuxidc  600        524288    2          目标

0x00000000 1867780    linuxidc  600        16777216  2          目标

0x00000000 4456453    linuxidc  600        16777216  2          目标

0x00000000 557062    linuxidc  600        524288    2          目标

0x00000000 4554759    linuxidc  600        4194304    2          目标

0x00000000 1048591    linuxidc  600        67108864  2          目标

--------- 信号量数组 -----------

键        semid      拥有者  权限    nsems

f3926e63821275241d366b1cbc9088f8.png

说明:

第一列就是共享内存的key;

第二列是共享内存的编号shmid;

第三列就是创建的用户owner;

第四列就是权限perms;

第五列为创建的大小bytes;

第六列为连接到共享内存的进程数nattach;

第七列是共享内存的状态status。其中显示“dest”表示共享内存段已经被删除,但是还有用户在使用它,当该段内存的mode字段设置为 SHM_DEST时就会显示“dest”。当用户调用shmctl的IPC_RMID时,内存先查看多少个进程与这个内存关联着,如果关联数为0,就会销 毁这段共享内存,否者设置这段内存的mod的mode位为SHM_DEST,如果所有进程都不用则删除这段共享内存。

具体的用法总结如下:

1、显示所有的IPC设施

linuxidc@linuxidc:~/linuxidc.com$ ipcs -a

--------- 消息队列 -----------

键        msqid      拥有者  权限    已用字节数 消息

------------ 共享内存段 --------------

键        shmid      拥有者  权限    字节    连接数  状态

0x00000000 4784128    linuxidc  600        524288    2          目标

0x00000000 393217    linuxidc  600        524288    2          目标

0x00000000 425986    linuxidc  600        524288    2          目标

0x00000000 458755    linuxidc  600        524288    2          目标

0x00000000 1867780    linuxidc  600        16777216  2          目标

0x00000000 4816901    linuxidc  600        16777216  2          目标

0x00000000 557062    linuxidc  600        524288    2          目标

0x00000000 4554759    linuxidc  600        4194304    2          目标

0x00000000 1048591    linuxidc  600        67108864  2          目标

--------- 信号量数组 -----------

键        semid      拥有者  权限    nsems

14480c384cb6c08404339ada63e7eefe.png

2、显示所有的消息队列Message Queue

# ipcs -q

bed2ee6d7764941f94a4366ac763b01c.png

3、显示所有的信号量

# ipcs -s

b55b685c357eb2355ae45137248b058f.png

4、显示所有的共享内存

# ipcs -m

6209b6b13fddd1d604ea8ab6536b0ca0.png

5、显示IPC设施的详细信息

# ipcs -q -i id

id 对应shmid、semid、msgid等。-q对应设施的类型(队列),查看信号量详细情况使用-s,查看共享内存使用-m。

6、显示IPC设施的限制大小

# ipcs -m -l

f5bd9f95e0d74e3b03dbfab238c31edb.png

-m对应设施类型,可选参数包括-q、-m、-s。

7、显示IPC设施的权限关系

# ipcs -c

# ipcs -m -c

# ipcs -q -c

# ipcs -s -c

8、显示最近访问过IPC设施的进程ID。

# ipcs -p

# ipcs -m -p

# ipcs -q -p

9、显示IPC设施的最后操作时间

# ipcs -t

# ipcs -q -t

# ipcs -m -t

# ipcs -s -t

10、显示IPC设施的当前状态

linuxidc@linuxidc:~/linuxidc.com$ ipcs -u

---------- 消息状态 -----------

已分配队列数 = 0

已用消息头(header)数 = 0

已用空间 = 0 字节

---------- 共享内存状态 ------------

段已分配 11

页已分配 27256

页驻留  7083

页交换  0

交换性能:0 次尝试  0 次成功

--------- 信号量状态 -----------

已使用数组 = 0

已分配信号量数 = 0

37c71c83bc3404142c445e123d5535b7.png

Linux上的ipcs命令,不支持UNIX上的-b、-o指令,同样UNIX中不支持-l、-u指令,所以在编写跨平台的脚本时,需要注意这个问题。

删除IPC

ipcrm -m| -q| -s shm_id

例如,我们在以0x12345678为KEY创建了一个共享内存,可以直接使用ipcrm -M 0x12345678来删除共享内存区域。

下面的命令可以释放所有已分配的共享内存:

ipcs -m | awk '$2 ~ /[0-9]+/ {print $2}' | while read s; do sudo ipcrm -m $s; done

9eb944457b8c8bdfb667b8ad3a151a52.png

0b1331709591d260c1c78e86d0c51c18.png

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值