在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误。您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法。

预备知识

Linux中通过API函数shmget创建的共享内存一般都是在程序中使用shmctl来释放的,但是有时为了调试程序,开发人员可能通过Ctrl + C等方式发送中断信号来结束程序,此时程序申请的共享内存就不能得到释放,当然如果程序没有改动的话,重新运行程序时仍然会使用上次申请的共享内存,但是如果我们修改了程序,由于共享内存的大小不一致等原因会导致程序申请共享内存错误。因此,我们总是希望每次结束时就能释放掉申请的共享内存。

有两种方法可以用来释放共享内存:

第一种:如果总是通过Crtl+C来结束的话,可以做一个信号处理器,当接收到这个信号的时候,先释放共享内存,然后退出程序。

第二种:不管你以什么方式结束程序,如果共享内存还是得不到释放,那么可以通过linux命令 ipcrm -m <shmid> 来释放,在使用该命令之前可以通过 ipcs -m 命令来查看共享内存。

共享内存查看

使用ipcs命令,不加如何参数时,会把共享内存、信号量、消息队列的信息都打印出来,如果只想显示共享内存信息,使用如下命令:

[root@localhost ~]# ipcs -m------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 1867776    root      600        393216     2          dest
0x00000000 1900545    root      600        393216     2          dest
0x00030021 1703938    zc        666        131104     1
0x0003802e 1736707    zc        666        131104     1
0x00030004 1769476    zc        666        131104     1
0x00038002 1802245    zc        666        131104     1
0x00000000 1933318    root      600        393216     2          dest
0x00000000 1966087    root      600        393216     2          dest
0x00000000 1998856    root      600        393216     2          dest
0x00000000 2031625    root      600        393216     2          dest
0x00000000 2064394    root      600        393216     2          dest
0x0014350c 2261003    cs        666        33554432   2
0x00000000 2129932    root      600        393216     2          dest
0x00000000 2162701    root      600        393216     2          dest
0x00143511 395837454  root      666        1048576    1      

其中:

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

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

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

第四列就是权限perms;

第五列为创建的大小bytes;

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

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

共享内存释放

要释放共享内存,需要使用ipcrm命令,使用shmid作为参数,shmid在ipcs命令中会有输出,下面的命令可以释放所有已经分片的共享内存:

# ipcrm -m <shmid>

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

注:Linux中vi使用Ctrl+s来锁定,需要使用Ctrl+q来解除锁定。

使用Python编写的rmsharemem.py脚本如下:

# -*- coding: utf-8 -*-
# Remove the share memory
import os
import sys
import getoptdef usage():print "usage: python rmsharemem.py -h -o <owner> -s size <shmid list>"print "  -h show help information"print "  -o <owner> the owner create share memory need to delete"print "  -s <size>  the share memory size"print "  <shmid list> the shmid list need to delete"def getsharemem():sharemap = {}fp = os.popen('ipcs -m')lines = fp.readlines()for l in lines:if not l.startswith('0x'):continues = l.split()if sharemap.has_key(s[2]):sharemap[s[2]].append(s)else:sharemap[s[2]] = [s]#print 'Share memory map:\n', sharemapreturn sharemapif __name__ == "__main__":opts, args = getopt.getopt(sys.argv[1:], "o:hs:")# opts is the parameter with options# args is the parameter no ptionsowner = Nonesize = 0for o, p in opts:if o == '-h':usage()sys.exit(0)elif o == '-o':owner = pelif o == '-s':size = pif not owner:val = raw_input("Are you sure to remove all share memory?(yes/no)");if (val <> "yes"):usage()sys.exit(0)count = 0total = 0if len(args) > 0:for shmid in args:cmd = 'ipcrm -m %s' % shmidprint 'execute command: %s' % cmdret = os.system(cmd)total += 1if ret == 0:count += 1print 'remove %s shared memory success' % shmidelse:print 'remove %s shared memory failed' % shmidelse:shmmap = getsharemem()for o, l in shmmap.items():if owner and o <> owner:continuefor p in l:total += 1if size and size <> p[4]:continuecmd = 'ipcrm -m %s' % p[1]print 'execute command: %s' % cmdret = os.system(cmd)if ret == 0:count += 1print 'remove %s shared memory success' % p[1]else:print 'remove %s shared memory failed' % p[1]print 'total share memory number = %s' % totalprint 'remove success number = %s' % countsys.exit(0)

共享内存大小修改

使用下面的命令查看共享内存的大小:

# cat /proc/sys/kernel/shmmax

修改共享内存大小:

临时修改:在root用户下执行# echo 268435456 > /proc/sys/kernel/shmmax把共享内存大小设置为256MB;

永久修改:在root用户下修改/etc/rc.d/rc.local文件,加入下面一行:

echo 268435456 > /proc/sys/kernel/shmmax

即可每次启动时把共享内存修改为256MB。

linux 共享内存 查看和删除相关推荐

  1. linux共享内存 dest,关于linux 共享内存查看已经完整释放

    完整删除共享内存脚本 #!/bin/sh function rmshm() { zero_status=`ipcs -m|awk '{print $6}'|grep -w 0|wc -l` if [ ...

  2. linux如何看分配固定共享内存段,Linux共享内存的查看和删除

    在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误.您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法. 预备知识 L ...

  3. 【Linux共享内存】

    Linux共享内存 一.基本概念 二.常用函数 1. shm_open 2. mmap 3. munmap 4. shm_unlink 5. ftruncate 三.使用示例 四.share内存不足解 ...

  4. linux查看设备内存代码,Linux下内存查看命令(示例代码)

    在Linux下面,我们常用top命令来查看系统进程,top也能显示系统内存.我们常用的Linux下查看内容的专用工具是free命令. Linux下内存查看命令free详解: 在Linux下查看内存我们 ...

  5. LINUX共享内存使用常见陷阱与分析(转)

    所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式.是针对其他通信机制运行效率较低而设计的.往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥.其他进程能把同一段共 ...

  6. Linux共享内存(二)

    Linux共享内存编程实例 原文链接:http://blog.csdn.net/pcliuguangtao/article/details/6526119 /*共享内存允许两个或多个进程进程共享同一块 ...

  7. c++ 共享内存_关于Linux共享内存的实验 [二] - 原因

    关于Linux共享内存的实验 [一] 上文采用的"删文件"和"杀进程"的方法主要是为了快速演示实验现象,但这种做法不利于通过调试手段进一步探究其内在的逻辑.为此 ...

  8. linux 共享内存操作(shm_open、mmap、编译链接库:-lz -lrt -lm -lc都是什么库)

    文章目录 linux 共享内存操作(shm_open) 一.背景 二.函数使用说明 shm_open ftruncate(改变文件大小) mmap共享内存 三.示例代码 创建内存共享文件并写入数据 打 ...

  9. linux获取共享内存失败2,unix/linux共享内存应用与陷阱

    共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区.在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一 个共享内存区的最大字节数shmmax,系统范围内最大共享内存 ...

最新文章

  1. LeetCode 152. Maximum Product Subarray--动态规划--C++,Python解法
  2. k8s多master建议用几个_Kubernetes 教程之跟着官方文档从零搭建 K8S
  3. 【OpenCV学习笔记2】OpenCV 完全安装 新增VS2010+OpenCV2.1,新增VS2010+OpenCV2.3.1
  4. 运维前线:一线运维专家的运维方法、技巧与实践导读
  5. 【CodeForces - 697C】Lorenzo Von Matterhorn(二叉树,思维)
  6. Java预科篇2-环境搭建
  7. steam夏日促销悄然开始,用Python爬取排行榜上的游戏打折信息
  8. java 判断是否包含中文_java判断字符串中是否包含中文并过滤中文
  9. Android修图处理算法—— drawBitmapMesh算法实现瘦脸效果
  10. Webdriver for python 入门示例2(浏览器句柄操作)
  11. OSChina 周二乱弹 —— 这样成功要到小护士姐姐的微信
  12. VALSE学习(十三):网络结构搜索提速方法和训练技巧-NAS
  13. elementui表格列宽自适应_Java 操作Word表格——创建嵌套表格、添加复制表格行或列...
  14. bisect algorithm(python 的标准库函数 bisect model)
  15. 范凯:对移动社交型app的一点思考
  16. 关于SAS学习的记录
  17. matlab 关闭mdl,双击m文件和mdl文件重新打开一个matlab主程序
  18. 【软件工程】软件工程系统设计——详细设计(过程设计)
  19. Unity移动平台相关(一)
  20. SA方法分析-图书管理系统

热门文章

  1. 分层设计与领域设计融合架构设计
  2. testng.xml 配置大全
  3. 身为程序员,你接过最奇葩的需求是什么?丨Q言Q语
  4. 让您的开机时间和打开网页速度如飞一样
  5. 【转】How Many Boyfriends
  6. docker 疑难杂症
  7. 基于PowerShell 3.0的web接口测试
  8. 软件设计是怎样炼成的(6)——打造系统的底蕴(数据库设计)(上篇)
  9. jSearch(聚搜) v0.5.0 发布,多项更新和体验优化
  10. WebWorker与WebSocket实现前端消息总线