Linux共享内存的查看和删除

2023-11-07

使用的总结

1. 共享内存查看

   命令:ipcs -m

  

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status     

0x00000000 1867776    root      600        393216     2          dest  


其中:

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

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

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

第四列就是权限perms;

第五列为创建的大小bytes;

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


2. 共享删除

    命令:ipcs -m <shmid>



//=========================================

在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误。您可以使用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 <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 getopt

 

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

            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。


//=================================

ipcrm命令的用法

ipcrm命令view plain DESCRIPTION The  ipcrm utility shall remove zero or more message queues, semaphore sets, or shared mem- ory segments. The interprocess communication facilities to be removed are specified by  the options.

  Only  a user with appropriate privilege shall be allowed to remove an interprocess communi- cation facility that was not created by or owned by the user invoking ipcrm.

  -q  msgid ——队列id Remove  the  message  queue identifier msgid from the system and destroy the message queue and data structure associated with it.

  -m  shmid  ——共享内存id Remove the shared memory identifier shmid from the system. The shared memory segment and data structure associated with it shall be destroyed after the last detach.

  -s  semid  ——信号量id Remove  the  semaphore  identifier  semid  from  the  system  and destroy the set of semaphores and data structure associated with it.比如 ipcrm -m 2359299


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux共享内存的查看和删除 的相关文章

  • gethostbyname() 或 getnameinfo() 如何在后台工作?

    How gethostbyname or getnameinfo 在后台工作 include
  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • 批量设置命令的输出和错误以分隔变量

    在Windows 7批处理 cmd exe命令行 中 我试图将命令的标准输出 stdout 和标准错误 stderr 重定向到单独的变量 因此第一个变量设置为输出 第二个变量设置为输出 变量设置为错误 如果有 而不使用任何临时文件 我已经尝
  • 停止服务时单元陷入故障状态(状态=143)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是我的问题 我有 CentOS 和 java 进程在上面运行 Java进程是通过启动 停止脚本来操作的 它也创建了 java 实例的 p
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • diff 文件仅比较每行的前 n 个字符

    我有2个文件 我们将它们称为 md5s1 txt 和 md5s2 txt 两者都包含a的输出 find type f print0 xargs 0 md5sum sort gt md5s txt 不同目录下的命令 许多文件被重命名 但内容保
  • 如何更改 Ubuntu 14.04 上的 php-cli 版本?

    我是 Linux 新手 在篡改时破坏了一些 php 设置 如果我执行一个包含以下内容的 php 脚本 phpinfo 它显示 php 版本为 5 6 但通过命令行 如果我运行php v它返回 7 0 版本 我想让两个版本匹配 我怎样才能修复
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • 如何修复“iptables:没有该名称的链/目标/匹配”?

    我在我的 Linux 嵌入式系统上构建并安装了 iptables 如果我列出所有规则 则一切正常 iptables list Chain INPUT policy ACCEPT target prot opt source destinat
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue

随机推荐

  • axios访问后台404_使用 axios 后台无法接收到数据的解决方案

    如果想看排错思路的 可以看完踩坑经历 想直接要结果的 可以直接看解决方案 踩坑经历 最近我在使用 SSM Vue 做自己的小项目 Dao层 和 Service层 之类的代码已经写好了 就差 Controller层 和 Vue 的视图层还没有
  • jdk17安装及环境变量的配置

    jdk17安装及环境变量的配置 跳转oracle官方页面 点击直接下载Windowsjdk17 1 点击下载好的文件 然后下一步 2 在该页面中可以更改jdk的安装目录 默认是C盘 3 安装成功 安装成功之后 对其进行环境变量的配置 4 我
  • RFID系统在物流仓储中的应用

    RFID系统是一种无线识别技术 最近成为物流仓储行业的热门话题 本文将介绍RFID系统在物流仓储中的应用 包括如何使用RFID标签进行物流管理 如何使用RFID技术提高仓库的安全性 并细述RFID技术在物流仓储中的优势 除此之外 本文还会探
  • 华为od机考真题-报数游戏

    while 1 try m int input if 1 gt m or m gt 100 print ERROR else 模拟1 100的圈 nums
  • keil使用指南

    keil使用指南 1 项目的创建 头文件 1 项目的创建 1 首先创建文件夹 2 打开keil软件而后 创建新项目 并定位到1创建的文件夹 3 创建文件 并将文件添加到项目中 4 勾选hex文件生成 5 项目demo编写与编译 编译当前所在
  • 实战wxPython:051- 自定义控件

    前面系列文章中 我们介绍了wxPython提供各种的各种控件 在一般情况下可以满足我们开发应用的各种需求 但是在一些情况下 比如对按钮的美化 一个可以显示CPU占用率的控件等等 这首就需要自定义的控件 才能满足要求 自定义控件可以通过两种方
  • Postgresql 学习记录,模式,分区表,触发器,事务,窗口函数,视图,建表,约束等

    Postgresql 学习记录 模式 分区表 触发器 事务 窗口函数 视图 建表 约束等 PostgreSQL使用一种客户端 服务器的模型 一次PostgreSQL会话由下列相关的进程 程序 组成 一个服务器进程 它管理数据库文件 接受来自
  • 将word文档转换为图片格式的PDF

    0x00 前言 编写一篇文档后 往往会通过转为pdf版本后发布来避免在不同环境下格式出现混乱的情况 但这样操作转出pdf文档可以通过普通的pdf阅读器进行文本的抓取 不能达到我们想要保护知识产权的想法 因此在这里推出一篇如何将word文档转
  • 设计模式之(二)---代理模式Proxy Pattern

    什么是代理模式呢 我很忙 忙的没空理你 那你要找我呢就先找我的代理人吧 那代理人总要知道 被代理人能做哪些事情不能做哪些事情吧 那就是两个人具备同一个接口 代理人虽然不能干活 但是被 代理的人能干活呀 比如西门庆找潘金莲 那潘金莲不好意思答
  • 前端优化-WEB综合

    开启 gzip 压缩 gzip 是 GNUzip 的缩写 最早用于 UNIX 系统的文件压缩 HTTP 协议上的 gzip 编码是一种用来改进 web 应用程序性能的技术 web 服务器和客户端 浏览器 必须共同支持 gzip 目前主流的浏
  • object...args参数

    Java object args参数 Java反射中用到方法public Object newInstance String className Object args 该方法中使用了object args参数 也可以写成object ar
  • 认清现实重新理解游戏的本质

    认清现实重新理解游戏的本质 OVERVIEW 认清现实重新理解游戏的本质 现实 两条小路的启发 四个动机 1 当前的学习任务或工作任务太艰巨 2 完美主义 3 对未来太过于自信 无知 4 大脑小看未来的收益 四个方法 1 让未来的收益足够巨
  • R语言 时间序列ARIMA模型方法

    原理什么的百度一搜一堆 看不明白 先学会用这个工具吧 ARIMA 全称为自回归积分滑动平均模型 Autoregressive Integrated Moving Average Model 简记ARIMA 是由博克思 Box 和詹金斯 Je
  • 使用git提交代码到gerrit

    系统 Linux 需要安装 git 第一步 cd mkdir learn git cd learn git 注意 下面的用户名和邮箱和gerrit网站的账号一定要相同 git config global user name 用户名 git
  • python爬取百度使用kw关键字爬取时出现,百度安全验证,解决方法

    python爬取百度使用kw关键字爬取时出现 百度安全验证 解决方法 之前爬取百度用kw时的代码 没有任何问题 import requests url http www baidu com s headers User Agent Mozi
  • 工具类用于ajax使用json请求时返回一个json

    package com noe utils import java util HashMap 工具类 封装响应内容 会被转成json响应 MyStatus ok gt new MyStatus 0 gt code 0 new MyStatu
  • Jenkins部署及代码静态检查工具Checkstyle集成

    CheckStyle是SourceForge下的一个项目 提供了一个帮助JAVA开发人员遵守某些编码规范的工具 接下来给大家讲下如何在jenkins 我是在tomcat下安装的jenkins 集成checkstyle 构建项目并发送邮件 一
  • Face Alignment / Human Pose Estimation [CVPR‘23, ECCV‘22, NeurIPS‘22]

    CVPR 23 accepted paper list Facial Landmark Face Alignment 论文较少 CVPR 23 3篇 值得关注的子领域 Synthetic Data STAR Loss Reducing Se
  • Service层有多个查询,若依(ruoyi)分页失灵?如何解决呢?

    Service层有多个查询 若依分页失灵 教你如何解决 情景一 当Service层只有一个查询时 若需要分页 只需要在Controller层做以下操作 添加继承BaseController中的startPage 和getDataTable
  • Linux共享内存的查看和删除

    使用的总结 1 共享内存查看 命令 ipcs m Shared Memory Segments key shmid owner perms bytes nattch status 0x00000000 1867776 root 600 39