【问题标题】:OS X Shared Memory CleanupOS X 共享内存清理
【发布时间】:2013-09-17 16:36:08
【问题描述】:
我通过在 OS X 中使用 shm_open/mmap 分配共享内存段,在父进程和多个子进程之间共享内存。父进程或子进程都可以创建该段,然后将标识名称传达给任何一方。我的理解是,当父级退出清理内存时,必须在每个段上调用 shm_unlink,否则共享内存会永久泄漏。
我最初阅读文档的想法是,当没有映射的进程处于活动状态时,共享段会被清理。然而实验表明情况并非如此,必须有人明确使用 shm_unlink。
OS X 中有没有办法列出所有当前存在的共享内存段? 问题是父级可能会崩溃,因此没有机会调用 shm_unlink。在 Linux 中,我的解决方案是清除 /dev/shm,但在 OS X 中,我需要某种方式列出打开的共享段。
【问题讨论】:
标签:
macos
memory
memory-leaks
shared
【解决方案1】:
答案似乎是:你不能。
首先,看看这个question,它引用了内核中的一条注释:
- 待办事项:
(2) 需要通过 a 将数据导出到用户态工具
系统控制。应该扩展 ipcs(1) 和 ipcrm(1) 还是应该新建
管理 POSIX 内核信号量和 POSIX 共享的工具
内存要写吗?
还可以在 Apple 邮件列表 unix-porting 上查看 post:
There is no "picps"/"picprm" utility, you are expected to remember what
you create and clean up afterward, or clean up first thing on
restart if you crash a lot, there is nothing exposed directly
in the filesystem namespace, and you are expected to do
the shm_unlink because it is a rendezvous for potentially a
lot of unrelated programs.
【解决方案2】:
希望你能解决你的问题。您可以使用ipcs -a 并在“共享内存”标题下查看 NATTCH。该值将告诉您有多少人与特定 ID 相关联。