我通过在OS X中使用shm_open / mmap分配共享内存段来共享父进程和多个子进程之间的内存。父进程或子进程可以创建该分段,然后将标识名称传递给其中任何一个。我的理解是父进程在退出内存时必须在每个段上调用shm_unlink,否则共享内存会永久泄露。
我在阅读文档时最初的想法是,当没有映射的进程存活时,共享段被清除。然而,实验表明情况并非如此,有人必须明确使用shm_unlink。
OS X中是否有任何方法可以列出所有当前存在的共享内存段?问题是父级可能会崩溃,因此没有机会调用shm_unlink。在Linux中,我的解决方案是清除/ dev / shm,但在OS X中,我需要一些方法来列出开放的共享段。
答案 0 :(得分:3)
答案似乎是:你不能。
首先,请参阅此question,它引用内核中的注释:
- TODO:
(2)需要通过a将数据导出到用户态工具 sysctl的。应该扩展ipcs(1)和ipcrm(1)还是应该是新的 用于管理POSIX内核信号量和POSIX共享的工具 记忆要写吗?
另请参阅Apple邮件列表中的post unix-porting:
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.
答案 1 :(得分:0)
希望你弄清楚你的问题。您可以使用ipcs -a
并查看共享内存标题下的NATTCH。该值将告诉您有多少人附加到特定ID。