【问题标题】: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.
    

    【讨论】:

    • wine.hq 是怎么做到的?
    【解决方案2】:

    希望你能解决你的问题。您可以使用ipcs -a 并在“共享内存”标题下查看 NATTCH。该值将告诉您有多少人与特定 ID 相关联。

    【讨论】:

      猜你喜欢
      • 2014-10-19
      • 2011-10-09
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 2014-10-08
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多