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

预备知识

Linux中通过API函数shmget创建的共享内存一般都是在程序中使用shmctl来释放的,但是有时为了调试程序,开发人员可能通过Ctrl

+

C等方式发送中断信号来结束程序,此时程序申请的共享内存就不能得到释放,当然如果程序没有改动的话,重新运行程序时仍然会使用上次申请的共享内存,但是如果我们修改了程序,由于共享内存的大小不一致等原因会导致程序申请共享内存错误。因此,我们总是希望每次结束时就能释放掉申请的共享内存。

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

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

第二种:不管你以什么方式结束程序,如果共享内存还是得不到释放,那么可以通过linux命令ipcrm shm

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

# 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 getopt

def usage():

print

"usage: python rmsharemem.py -h -o

-s size

list>"

print

" -h show help information"

print

" -o the

owner create share memory need to delete"

print

" -s

the share

memory size"

print

"  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'):

continue

s = l.split()

if sharemap.has_key(s[2]):

sharemap[s[2]].append(s)

else:

sharemap[s[2]] = [s]

#print

'Share memory map:\n', sharemap

return

sharemap

if __name__ == "__main__":

opts,

args = getopt.getopt(sys.argv[1:], "o:hs:")

# opts is

the parameter with options

# args is

the parameter no ptions

owner =

None

size =

0

for o, p

in opts:

if o == '-h':

usage()

sys.exit(0)

elif o == '-o':

owner = p

elif o == '-s':

size = p

if not

owner:

val = raw_input("Are you sure to remove all share

memory?(yes/no)");

if (val <> "yes"):

usage()

sys.exit(0)

count =

0

total =

0

if

len(args) > 0:

for shmid in args:

cmd = 'ipcrm -m %s' % shmid

print 'execute command: %s' % cmd

ret = os.system(cmd)

total += 1

if ret == 0:

count += 1

print 'remove %s shared memory success' % shmid

else:

print 'remove %s shared memory failed' % shmid

else:

shmmap = getsharemem()

for o, l in shmmap.items():

if owner and o <> owner:

continue

for p in l:

total += 1

if size and size <> p[4]:

continue

cmd = 'ipcrm -m %s' % p[1]

print 'execute command: %s' % cmd

ret =

os.system(cmd)

if ret == 0:

count += 1

print 'remove %s shared memory success' % p[1]

else:

print 'remove %s shared memory failed' % p[1]

print

'total share memory number = %s' % total

print

'remove success number = %s' % count

sys.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如何看分配固定共享内存段,Linux共享内存的查看和删除相关推荐

  1. oracle的共享内存段,oracle共享内存段手工清理

    当Oracle数据库意外当机,操作系统内存共享段未释放,便无法重启数据库至nomount状态,此时需要手工清理. 现象: 1.可以看到有2个smon进程 $ ps -ef|grep smon orac ...

  2. linux 内存 段,Linux内存储器管理之分段机制

    Linux内存管理之分段机制 逻辑地址就是我们普通的段+偏移的表现方式,而线性地址就是段+偏移之后算出来的一个地址,前者可以认 为是二维的地址,而后者可以理解是一维的.线性地址和虚拟地址的概念相接近, ...

  3. linux怎么看go写的程序进程,Linux中查看进程状态信息-Go语言中文社区

    Linux中查看进程状态信息 一.常用命令总结 ps -l   列出与本次登录有关的进程信息: ps -aux   查询内存中进程信息: ps -aux | grep ***   查询***进程的详细 ...

  4. 嵌入式Linux系统编程学习之二十三 System V 共享内存机制

    文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言   共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...

  5. UC编程9-管道pipe操作和共享内存段shm操作

    //myuc.h #include<stdio.h>//io流 #include<stdlib.h>//标准库 #include<unistd.h>//uc标准头文 ...

  6. 在Oracle 11g中用看Oracle的共享内存段---------IPCS

    很早之前,在一次讲课了,用了命令ipcs,发现oracle的共享内段好小,如下: oracle@mydb ~]$ ipcs -a------ Shared Memory Segments ------ ...

  7. linux操作系统中查找某个进程,在linux下查看有哪些操作系统进程正在使用某一个共享内存段...

    [root@abc log]# ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch st ...

  8. Linux释放内存及手动释放Oracle共享内存段

    free -m #echo 3 > /proc/sys/vm/drop_caches#cat /proc/sys/vm/drop_caches3 free -m 手动删除Oracle共享内存段 ...

  9. linux动态链接库全局变量共享问题DLL共享数据段

    Linux写时拷贝技术(copy-on-write) 进程间是相互独立的,其实完全可以看成A.B两个进程各自有一份单独的liba.so和libb.so,相应的动态库的代码段和数据段都是各个进程各自有一 ...

最新文章

  1. hp laser103 属性没有配置项_冰雪传奇:起源之上还有装备吗?详解鸿蒙装备合成与属性...
  2. centso7 install Mariadb
  3. WebAPI返回数据类型解惑 以及怎样解决Extjs无法解析返回的xml
  4. kong组件_KONG基础使用-阿里云开发者社区
  5. JS设计模式(2)策略模式
  6. birt project mysql_eclipse birt如何连接mysql数据库 配置文件
  7. windows平台下载编译好的webrtc代码vs2015
  8. 苹果发布会邀请函被玩坏:神似桂林西瓜霜
  9. Bailian2753 菲波那契数列(POJ NOI0202-1755)【数列+记忆化递归】
  10. Linux网络和进程管理
  11. java 生成条形码_Springboot生成二维码,怎么搞?
  12. 使用ifconfig命令来看网卡的IP,但是,输入命令之后,eht0里面只有 inet6 addr 而没有 inet addr...
  13. python安装插件很慢_Sublime text3+python3配置及插件安装
  14. 快速解决win7系统Aero主题无法使用
  15. 简单有效的低照度增强
  16. c语言在屏幕上输出一个菱形图案,C语言 在屏幕上输出菱形图案
  17. 朋友圈集赞,简洁壁纸,玩游戏学git
  18. 学籍管理查找学生信息 c语言,【C语言期末实训】学生学籍管理系统
  19. 谷歌卫星地图、电子地图和地形图有什么区别?
  20. 全国等级保护测评机构推荐目录

热门文章

  1. 【英语学习】【Level 07】U05 Best Destination L4 A perfect destination
  2. 【英语学习】【Level 07】U02 Live Work L1 Welcome to my home
  3. 【英语学习】【English L06】U08 News L2 Have you read the news about the light show?
  4. 新手配置 Jetty + Eclipse (Hot code debugging)
  5. C++(Leetcode):两数之和
  6. 计算机二级数据模型三要素,2017年计算机二级公共基础知识重点讲解:数据模型...
  7. cad字体渐变_[AI10]透明渐变得问题 字体命令的一个变 pantone色系 AutoCAD2006中文版...
  8. IOS应用程序发布到苹果APP STORE完整流程使用教程
  9. Google宣布支持Vulkan作为Android的底层图形API
  10. 关于Early-Z Culling(提前Z拣选)