news 2026/6/23 18:42:09

Linux进程间通信之操作共享内存的命令

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux进程间通信之操作共享内存的命令

System V 共享内存系统管理命令

本文档介绍用于查看和管理 System V 共享内存段的系统命令.

查看共享内存

查看所有共享内存段

ipcs -m

输出示例:

------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 0 root 600 4096 0 0x12345678 32769 user 666 128 2

字段说明:

  • key: 共享内存段的键值
  • shmid: 共享内存标识符
  • owner: 所有者
  • perms: 权限
  • bytes: 大小(字节)
  • nattch: 当前附加的进程数
  • status: 状态(见下方详细说明)

status 字段说明

status字段显示共享内存段的当前状态, 可能的值包括:

空(正常状态)

status字段为空时, 表示共享内存段处于正常状态:

  • 段未被标记为删除
  • 可以正常使用
  • 进程可以附加和分离

示例输出:

key shmid owner perms bytes nattch status 0x12345678 32769 user 666 128 2
dest(删除标记)

status字段显示dest时, 表示共享内存段已被标记为删除:

  • 段已被调用shmctl(IPC_RMID)ipcrm -m标记为删除
  • 但仍有进程附加到该段, 因此段尚未真正删除
  • 新的进程不能再附加到该段
  • 当所有进程都分离(shmdt)后, 段才会被真正删除

示例输出:

key shmid owner perms bytes nattch status 0x12345678 32769 user 666 128 1 dest

状态转换流程:

正常状态 → shmctl(IPC_RMID) → dest 状态 → 所有进程分离 → 真正删除

注意事项:

  1. dest状态是临时状态, 表示段正在等待所有进程分离
  2. 如果看到dest状态但nattch为 0, 可能是显示延迟, 段应该很快会被删除
  3. 处于dest状态的段无法被新进程附加, 但已附加的进程仍可正常使用
  4. 如果程序异常退出未调用shmdt(), 段可能一直处于dest状态, 需要手动清理

查看处于删除状态的共享内存段:

# 查看所有标记为删除的共享内存段ipcs -m|grepdest# 查看标记为删除且没有进程附加的段ipcs -m|awk'NR > 3 &&$7== "dest" &&$6== 0 {print$2}'

查看特定共享内存段的详细信息

ipcs -m -i<shmid>

例如:

ipcs -m -i32769

查看系统限制

ipcs -l

或者只查看共享内存的限制:

ipcs -l -m

输出示例:

------ Shared Memory Limits -------- max number of segments = 4096 max seg size (kbytes) = 18014398509481983 max total shared memory (kbytes) = 18014398509481983 min seg size (bytes) = 1

删除共享内存

根据 shmid 删除

ipcrm -m<shmid>

例如:

ipcrm -m32769

根据键值删除

ipcrm -M<key>

例如:

ipcrm -M 0x12345678

注意:

  • 删除共享内存段时, 如果仍有进程附加到该段, 段不会被立即删除, 而是标记为删除状态. 当所有进程都分离后, 段才会被真正删除.
  • 使用IPC_PRIVATE创建的共享内存段只能通过shmid删除, 因为键值为 0, 无法通过键值删除.

删除时机和注意事项

删除时机:

  1. 立即删除: 调用shmctl(IPC_RMID)ipcrm -m后, 共享内存段立即被标记为删除
  2. 真正删除: 当所有进程都调用shmdt()分离后, 段才会被真正删除

注意事项:

  1. 进程仍在使用: 如果仍有进程附加到该段, 段不会被立即删除, 而是标记为删除状态(dest)
  2. 新进程无法附加: 标记为删除后, 新的进程不能再附加到该段
  3. 已附加进程: 已附加的进程仍可正常使用, 直到调用shmdt()分离
  4. 异常退出: 如果进程异常退出未调用shmdt(), 段可能一直处于dest状态, 需要手动清理
  5. 权限要求: 只有创建者、所有者或 root 用户可以删除共享内存段

删除状态检查

删除后可以检查状态确认:

# 查看是否标记为删除ipcs -m|grep<shmid># 如果显示 "dest" 状态, 说明已标记为删除, 等待进程分离# 如果不再显示, 说明已真正删除

删除所有共享内存段(谨慎使用)

# 删除当前用户创建的所有共享内存段ipcs -m|awk'$3== ENVIRON["USER"] {print$2}'|xargs-I{}ipcrm -m{}

或者使用 root 权限删除所有共享内存段:

ipcs -m|awk'NR > 3 {print$2}'|xargs-I{}ipcrm -m{}

常用命令组合

查看并清理残留的共享内存段

# 查看所有共享内存段ipcs -m# 查看没有进程附加的共享内存段ipcs -m|awk'NR > 3 &&$6== 0 {print$2}'# 删除没有进程附加的共享内存段ipcs -m|awk'NR > 3 &&$6== 0 {print$2}'|xargs-I{}ipcrm -m{}

查看特定用户的共享内存段

ipcs -m|grep<username>

判断共享内存是否被进程附加

方法 1: 查看 nattch 字段

nattch字段显示当前附加到共享内存段的进程数:

ipcs -m
  • nattch = 0: 没有进程附加, 共享内存段空闲
  • nattch > 0: 有进程附加, 数值表示附加的进程数

示例:

key shmid owner perms bytes nattch status 0x12345678 32769 user 666 128 2

表示有 2 个进程正在使用该共享内存段.

方法 2: 查看创建者和最后操作者 PID

使用-p选项查看创建者和最后操作者的进程 ID:

ipcs -m -p

输出示例:

------ Shared Memory Segments -------- key shmid owner perms bytes nattch cpid lpid 0x12345678 32769 user 666 128 2 1234 5678

字段说明:

  • cpid: 创建者进程 ID
  • lpid: 最后操作者进程 ID(最后调用shmatshmdt的进程)

注意:lpid是最后操作的进程, 不一定是当前附加的进程. 要确认进程是否仍在附加, 需要结合nattch字段.

方法 3: 使用 lsof 命令

lsof可以显示哪些进程打开了共享内存段:

# 查看所有使用共享内存的进程lsof|grepshm# 查看特定共享内存段的使用情况(需要知道段在 /dev/shm 中的文件名)# 注意: System V 共享内存通常不显示在 /dev/shm 中, 此方法主要用于 POSIX 共享内存

方法 4: 查看 /proc/sysvipc/shm

直接查看内核提供的共享内存信息:

cat/proc/sysvipc/shm

输出示例:

key shmid perms size cpid lpid nattch uid gid cuid cgid atime dtime ctime 305419896 32769 666 128 1234 5678 2 1000 1000 1000 1000 1234567890 1234567890 1234567890

字段说明:

  • key: 键值
  • shmid: 共享内存标识符
  • perms: 权限
  • size: 大小(字节)
  • cpid: 创建者进程 ID
  • lpid: 最后操作者进程 ID
  • nattch: 当前附加的进程数
  • uid/gid: 所有者用户 ID/组 ID
  • cuid/cgid: 创建者用户 ID/组 ID
  • atime: 最后附加时间
  • dtime: 最后分离时间
  • ctime: 最后变更时间

方法 5: 使用 fuser 命令(不适用于 System V 共享内存)

fuser主要用于文件, System V 共享内存不适用此方法.

实用命令组合

查看所有正在使用的共享内存段
# 查看 nattch > 0 的共享内存段ipcs -m|awk'NR > 3 &&$6> 0'# 或者使用更详细的格式ipcs -m -p|awk'NR > 3 &&$6> 0'
查看特定共享内存段的详细信息
# 查看特定 shmid 的详细信息ipcs -m -i<shmid># 查看特定 shmid 的创建者和最后操作者ipcs -m -p -i<shmid>
查找附加到特定共享内存段的进程
# 方法 1: 通过 /proc/sysvipc/shm 查找cat/proc/sysvipc/shm|awk'$2== <shmid> {print "nattch:",$7, "cpid:",$5, "lpid:",$6}'# 方法 2: 结合 ps 查看进程信息SHMID=32769LPID=$(ipcs -m -p -i $SHMID|awk'NR > 3 {print$8}')if[-n"$LPID"]&&["$LPID"!="lpid"];thenps-p$LPID-o pid,cmdfi
监控共享内存使用情况
# 实时监控共享内存的附加情况watch-n1'ipcs -m | awk "NR > 3 && \$6> 0 {print}"'# 或者使用更详细的监控watch-n1'ipcs -m -p | awk "NR > 3 && \$6> 0 {print}"'

判断流程总结

  1. 快速判断: 查看nattch字段

    • nattch = 0: 没有进程附加
    • nattch > 0: 有进程附加
  2. 查看进程信息: 使用ipcs -m -p查看创建者和最后操作者 PID

  3. 详细信息: 查看/proc/sysvipc/shm获取完整信息

  4. 确认进程: 使用ps命令确认进程是否仍在运行

注意事项:

  • nattch字段是最可靠的判断依据
  • lpid是最后操作的进程, 不一定是当前附加的进程
  • 如果进程异常退出未调用shmdt(),nattch可能不会立即更新
  • 系统重启后, 所有共享内存段都会被清除

相关命令说明

ipcs 命令

ipcs用于显示 IPC 对象(消息队列、共享内存、信号量)的信息.

常用选项:

  • -m: 显示共享内存段信息
  • -q: 显示消息队列信息
  • -s: 显示信号量信息
  • -a: 显示所有 IPC 对象信息
  • -l: 显示系统限制
  • -i <id>: 显示指定 ID 的详细信息
  • -p: 显示创建者和最后操作者的 PID
  • -t: 显示时间信息

ipcrm 命令

ipcrm用于删除 IPC 对象.

常用选项:

  • -m <shmid>: 根据 shmid 删除共享内存段
  • -M <key>: 根据键值删除共享内存段
  • -q <msqid>: 根据 msqid 删除消息队列
  • -Q <key>: 根据键值删除消息队列
  • -s <semid>: 根据 semid 删除信号量
  • -S <key>: 根据键值删除信号量

扩展阅读

  • man 1 ipcs- 查看 IPC 对象信息
  • man 1 ipcrm- 删除 IPC 对象
  • man 2 shmget- 创建/获取共享内存段
  • man 2 shmctl- 控制共享内存段
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 19:53:39

企业级html 图书管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 在信息化时代背景下&#xff0c;图书管理系统的智能化与高效化成为图书馆和企业资源管理的核心需求。传统的图书管理方式依赖人工操作&#xff0c;存在效率低下、数据易丢失、查询不便等问题&#xff0c;难以满足现代企业对图书资源的精准管理和快速检索需求。随着互联网技…

作者头像 李华
网站建设 2026/6/23 19:52:38

7、伪微分算子相关理论及狄拉克哈密顿量的解耦

伪微分算子相关理论及狄拉克哈密顿量的解耦 1. 伪微分算子的基本概念与相关公式 在研究中,涉及到一些重要的公式和概念。例如,有如下表达式: [ c_2(x, \xi) = \sum_{|\iota|\leq N} \frac{(-i)^{|\iota|}}{\iota!} a^{(\iota)}(x, \xi)k^{(\iota)}(x, \xi) + R_{2N}(x, \…

作者头像 李华
网站建设 2026/6/23 19:52:52

基于微信小程序的在线家庭清洁系统毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于微信小程序的在线家庭清洁系统&#xff0c;以满足现代家庭对于便捷、高效、个性化的清洁服务需求。具体研究目的如下&#xff1a; …

作者头像 李华
网站建设 2026/6/22 22:22:38

20、微软 Windows Vista 使用指南:账户管理与数据保护

微软 Windows Vista 使用指南:账户管理与数据保护 临时提升账户权限 标准用户在某些时候可能需要执行一些通常受限的操作,比如安装新程序。幸运的是,只要有管理员密码持有者提供授权,标准用户无需注销当前账户、切换到管理员账户,就能执行受限操作。 当标准用户尝试执行…

作者头像 李华
网站建设 2026/6/23 3:00:34

15、活动目录用户与组管理操作指南

活动目录用户与组管理操作指南 在企业的 IT 环境中,活动目录(Active Directory,简称 AD)是一项至关重要的服务,它用于管理用户、计算机和其他资源。本文将详细介绍如何对用户对象的各种属性进行修改,以及如何创建和删除组对象。 1. 修改用户对象的配置文件属性 当你创…

作者头像 李华
网站建设 2026/6/23 18:15:51

17、活动目录计算机对象与组织单位管理指南

活动目录计算机对象与组织单位管理指南 1. 移动计算机对象 在管理活动目录时,有时需要移动计算机对象到不同的组织单位(OU)或容器中。可以通过以下两种方式实现: 1.1 使用 Windows 界面 点击“开始”,选择“管理工具”,然后点击“Active Directory 用户和计算机”。 …

作者头像 李华