2009-07-14 99 views
9

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

我的问题是,是否有任何理由不使用mmap()?看起来更简单一些,内存仍然是共享的,如果我使用MAP_ANON,它不需要创建一个真实的文件。我可以在父进程中创建文件,然后fork()和exec()子进程,并在子进程中使用它。

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

注意,我打算做使用我需要其他通信管道同步,即父母在管道上请求数据,孩子其写入共享内存,并响应在管道,它的准备。没有涉及多个读者或作者。可移植性不是优先事项。

回答

8

如果您有父母/子女关系,那么使用mmap是完全正确的。

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

如果你在没有mmap的posix系统上,你可以使用posix_shm。如果你在没有posix_shm的情况下使用unix,你可以使用sysv_shm。如果你只需要共享内存vs父母/孩子,你可以使用mmap。

+0

你不能使用posix_shm没有mmap,那部分是无稽之谈。不过,在第一段中你是正确的,posix_shm在没有父/子关系时启用mmap。 – 2013-12-24 23:36:41

0

如果有内存服务,使用SysV/POSIX而不是mmap的唯一原因是可移植性。特别是较老的Unix系统不支持MAP_ANON。 Solaris,Linux,BSD和OS X ,但是,实际上,没有什么理由不使用mmap

1

shm在Linux中通过/dev/shm文件获取mmap PED通常实现的,因此,性能应该是相当的 - 我会用mmap(W/MAP_ANONMAP_SHARED你提到)去为简单起见,如果我知道的可移植性如你所说的那样,这不是问题。

0

至于documentation知道,你必须如果你想使用Xlib/XCB共享存储器中的影像使用SYSV共享内存。