10

需要使用 IPC 将大量数据(200kb+)从子进程传递到 OS X 10.4 及更高版本的父进程,我阅读了 Unix 上的共享内存,特别是 System V 和 POSIX 共享内存机制。然后我意识到 mmap() 可以与 MAP_ANON 和 MAP_SHARED 标志一起使用来做类似的事情(或者只使用 MAP_SHARED 标志,如果我不介意创建常规文件)。

我的问题是,有什么理由不只使用 mmap() 吗?看起来简单多了,内存仍然是共享的,如果我使用 MAP_ANON 就不必创建真实文件。我可以在父进程中创建文件,然后 fork() 和 exec() 子进程并在子进程中使用它。

问题的第二部分是,这种方法不够用的原因是什么,必须使用 SysV 或 POSIX 共享内存机制?

请注意,我计划使用其他通信所需的管道进行同步,即父级通过管道请求数据,子级将其写入共享内存,并通过管道响应它准备好。不涉及多个读者或作者。便携性不是优先事项。

4

4 回答 4

8

如果您有父/子关系,则使用 mmap 非常好。

sysv_shm 是原始的 unix 实现,它允许相关和不相关的进程共享内存。posix_shm 标准化的共享内存。

如果你在没有 mmap 的 posix 系统上,你会使用 posix_shm。如果你在没有 posix_shm 的 unix 上,你会使用 sysv_shm。如果您只需要与父/子共享内存,则可以使用 mmap 。

于 2009-07-14T20:35:47.560 回答
1

如果没有记错的话,使用 SysV/POSIX 的唯一原因mmap是可移植性。特别是较旧的 Unix 系统不支持MAP_ANON. Solaris、Linux、BSD 和 OS X可以,但是,在实践中,几乎没有理由不使用mmap.

于 2009-07-14T05:03:13.740 回答
1

shm在 Linux 中通常是通过/dev/shm获取 ped 的文件实现的mmap,因此,性能应该是相同的——为了简单起见,我会选择mmap(w/MAP_ANONMAP_SHARED你提到的),如果我知道可移植性不是问题,正如你所说的那样.

于 2009-07-14T05:03:21.743 回答
0

文档所知,如果要使用Xlib / XCB共享内存映像,则必须使用 SYSV 共享内存。

于 2017-08-28T02:59:15.580 回答