ipcs -m仅显示system v共享内存段,非root用户默认只能看到自己创建的段;若为空或条目少,需sudo ipcs -ma查看全部,而posix共享内存须用ls -l /dev/shm/检查。

直接运行 ipcs -m 就能看到当前系统中所有 System V 共享内存段,但非 root 用户默认只能看到自己创建的段——这不是命令失效,是内核权限隔离机制在起作用。
为什么 ipcs -m 没输出或只显示自己创建的段
非 root 用户执行 ipcs -m 时,内核会自动过滤掉其他用户(包括系统服务)创建的共享内存段。这跟命令参数无关,ipcs -ma 中的 -a 并不能绕过该限制。
- 看到空输出或只有几行?先试
sudo ipcs -ma,这是唯一可靠方式 -
key值为0x00000000表示该段用IPC_PRIVATE创建,无法被其他进程通过shmget()关联,通常用于单进程内部临时共享 - 如果
nattch == 0但段长期存在,大概率是程序崩溃后漏调shmctl(shmid, IPC_RMID, NULL),属于残留资源
怎么区分 System V 和 POSIX 共享内存
ipcs -m 只管 System V(shmget/shmctl 创建的),完全不感知 POSIX(shm_open()+mmap() 映射 /dev/shm/ 下文件)。
- 你的代码里有
shm_open("/myshm", ...)或直接操作/dev/shm/myshm?那ipcs -m必定为空——不是没创建成功,是体系不同 - 验证方法:运行
ls -l /dev/shm/,有文件就说明用了 POSIX;df -h /dev/shm能看整体占用 - System V 段不会在
/dev/shm/下生成任何文件,两者物理隔离、命令分离、监控方式也完全不同
如何定位某段共享内存正在被哪些进程使用
ipcs -m 只给 nattch(附加进程数),不列 PID。要查具体是谁在用,必须进 /proc 手动翻:
- 先从
ipcs -m输出里拿到目标shmid(比如3080195) - 执行:
grep -r "shmid=3080195" /proc/[0-9]*/maps 2>/dev/null | cut -d':' -f1 | xargs -I{} basename {},输出就是正在使用的 PID 列表 - 对 POSIX 共享内存(
/dev/shm/xxx),换用:fuser -v /dev/shm/xxx或lsof +D /dev/shm - 注意:
ipcs -m -p只显示cpid(创建者 PID)和lpid(最后 attach/detach 的 PID),不是当前全部使用者
真正容易被忽略的是:POSIX 和 System V 共享内存共存时,监控工具必须切换命令集;而 ps 或 top 的 RSS 会把共享页重复计入每个进程——想看真实内存摊薄成本,得用 smem -s pss。











