4

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

我最初从阅读文档中想到的是,当没有映射的进程处于活动状态时,共享段会被清理。然而实验表明情况并非如此,必须有人明确地使用 shm_unlink。

OS X 中有没有办法列出所有当前存在的共享内存段?问题是父母可能会崩溃,因此没有机会调用 shm_unlink。在 Linux 中,我的解决方案是清除 /dev/shm,但在 OS XI 中需要某种方式列出打开的共享段。

4

2 回答 2

3

答案似乎是:你不能。

首先,看看这个问题,它引用了内核中的一条评论:

  • TODO:
    (2)需要通过 sysctl 将数据导出到用户态工具。应该扩展 ipcs(1) 和 ipcrm(1) 还是应该编写新工具来管理 POSIX 内核信号量和 POSIX 共享内存?

另请参阅Apple 邮件列表 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.
于 2014-11-29T08:52:04.710 回答
1

希望你弄清楚你的问题。您可以使用ipcs -a并查看标题下的 NATTCH 共享内存。该值将告诉您有多少人附加到特定 ID。

于 2014-03-03T17:45:20.010 回答