OS X共享内存清理

时间:2013-09-17 16:36:09

标签: macos memory memory-leaks shared

我通过在OS X中使用shm_open / mmap分配共享内存段来共享父进程和多个子进程之间的内存。父进程或子进程可以创建该分段,然后将标识名称传递给其中任何一个。我的理解是父进程在退出内存时必须在每个段上调用shm_unlink,否则共享内存会永久泄露。

我在阅读文档时最初的想法是,当没有映射的进程存活时,共享段被清除。然而,实验表明情况并非如此,有人必须明确使用shm_unlink。

OS X中是否有任何方法可以列出所有当前存在的共享内存段?问题是父级可能会崩溃,因此没有机会调用shm_unlink。在Linux中,我的解决方案是清除/ dev / shm,但在OS X中,我需要一些方法来列出开放的共享段。

2 个答案:

答案 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。