linux如何看分配固定共享内存段,Linux共享内存的查看和删除
在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误。您可以使用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():
"usage: python rmsharemem.py -h -o
-s size
list>"
" -h show help information"
" -o the
owner create share memory need to delete"
" -s
the share
memory size"
" 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]
'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]
'total share memory number = %s' % total
'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共享内存的查看和删除相关推荐
- oracle的共享内存段,oracle共享内存段手工清理
当Oracle数据库意外当机,操作系统内存共享段未释放,便无法重启数据库至nomount状态,此时需要手工清理. 现象: 1.可以看到有2个smon进程 $ ps -ef|grep smon orac ...
- linux 内存 段,Linux内存储器管理之分段机制
Linux内存管理之分段机制 逻辑地址就是我们普通的段+偏移的表现方式,而线性地址就是段+偏移之后算出来的一个地址,前者可以认 为是二维的地址,而后者可以理解是一维的.线性地址和虚拟地址的概念相接近, ...
- linux怎么看go写的程序进程,Linux中查看进程状态信息-Go语言中文社区
Linux中查看进程状态信息 一.常用命令总结 ps -l 列出与本次登录有关的进程信息: ps -aux 查询内存中进程信息: ps -aux | grep *** 查询***进程的详细 ...
- 嵌入式Linux系统编程学习之二十三 System V 共享内存机制
文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言 共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...
- UC编程9-管道pipe操作和共享内存段shm操作
//myuc.h #include<stdio.h>//io流 #include<stdlib.h>//标准库 #include<unistd.h>//uc标准头文 ...
- 在Oracle 11g中用看Oracle的共享内存段---------IPCS
很早之前,在一次讲课了,用了命令ipcs,发现oracle的共享内段好小,如下: oracle@mydb ~]$ ipcs -a------ Shared Memory Segments ------ ...
- linux操作系统中查找某个进程,在linux下查看有哪些操作系统进程正在使用某一个共享内存段...
[root@abc log]# ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch st ...
- Linux释放内存及手动释放Oracle共享内存段
free -m #echo 3 > /proc/sys/vm/drop_caches#cat /proc/sys/vm/drop_caches3 free -m 手动删除Oracle共享内存段 ...
- linux动态链接库全局变量共享问题DLL共享数据段
Linux写时拷贝技术(copy-on-write) 进程间是相互独立的,其实完全可以看成A.B两个进程各自有一份单独的liba.so和libb.so,相应的动态库的代码段和数据段都是各个进程各自有一 ...
最新文章
- hp laser103 属性没有配置项_冰雪传奇:起源之上还有装备吗?详解鸿蒙装备合成与属性...
- centso7 install Mariadb
- WebAPI返回数据类型解惑 以及怎样解决Extjs无法解析返回的xml
- kong组件_KONG基础使用-阿里云开发者社区
- JS设计模式(2)策略模式
- birt project mysql_eclipse birt如何连接mysql数据库 配置文件
- windows平台下载编译好的webrtc代码vs2015
- 苹果发布会邀请函被玩坏:神似桂林西瓜霜
- Bailian2753 菲波那契数列(POJ NOI0202-1755)【数列+记忆化递归】
- Linux网络和进程管理
- java 生成条形码_Springboot生成二维码,怎么搞?
- 使用ifconfig命令来看网卡的IP,但是,输入命令之后,eht0里面只有 inet6 addr 而没有 inet addr...
- python安装插件很慢_Sublime text3+python3配置及插件安装
- 快速解决win7系统Aero主题无法使用
- 简单有效的低照度增强
- c语言在屏幕上输出一个菱形图案,C语言 在屏幕上输出菱形图案
- 朋友圈集赞,简洁壁纸,玩游戏学git
- 学籍管理查找学生信息 c语言,【C语言期末实训】学生学籍管理系统
- 谷歌卫星地图、电子地图和地形图有什么区别?
- 全国等级保护测评机构推荐目录
热门文章
- 【英语学习】【Level 07】U05 Best Destination L4 A perfect destination
- 【英语学习】【Level 07】U02 Live Work L1 Welcome to my home
- 【英语学习】【English L06】U08 News L2 Have you read the news about the light show?
- 新手配置 Jetty + Eclipse (Hot code debugging)
- C++(Leetcode):两数之和
- 计算机二级数据模型三要素,2017年计算机二级公共基础知识重点讲解:数据模型...
- cad字体渐变_[AI10]透明渐变得问题 字体命令的一个变 pantone色系 AutoCAD2006中文版...
- IOS应用程序发布到苹果APP STORE完整流程使用教程
- Google宣布支持Vulkan作为Android的底层图形API
- 关于Early-Z Culling(提前Z拣选)