OS X 共享内存清理

5
我正在使用shm_open/mmap在OS X中为父进程和多个子进程之间共享内存。无论是父进程还是子进程都可以创建段,然后将标识名称传递给对方。我的理解是,当父进程退出时,必须对每个段调用shm_unlink来清理内存,否则共享内存会永久泄漏。
最初我从文档中的阅读认为,当没有映射它的进程存在时,共享段会被清除。然而实验表明这并非如此,必须有人明确地使用shm_unlink。
在OS X中是否有一种方法可以列出所有当前存在的共享内存段?问题在于父进程可能会崩溃,因此无法调用shm_unlink。在Linux中,我的解决方案是清除/dev/shm,但在OS X中,我需要一些列出打开的共享段的方式。
2个回答

4
答案似乎是:你不能。
首先,看看这个问题,它引用了内核中的一个评论:(链接)
  • TODO:
    (2) 需要通过sysctl向用户空间工具导出数据。ipcs(1)和ipcrm(1)应该扩展还是应该编写新的工具来管理POSIX内核信号量和POSIX共享内存?
此外,还请参阅苹果邮件列表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.

那么wine.hq是如何做到的呢? - Sergei Krivonos

2

希望你能解决问题。你可以使用ipcs -a命令,并查看“共享内存”标题下的NATTCH值。该值将告诉你有多少个共享内存段附加到特定的id上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接