需要使用IPC将大量数据(200kb +)从子进程传递到OS X 10.4及更高版本的父进程,我读取了Unix上的共享内存,特别是System V和POSIX共享内存机制。然后我意识到mmap()可以与MAP_ANON和MAP_SHARED标志一起使用来做类似的事情(或者只是使用MAP_SHARED标志,如果我不介意正在创建常规文件)。
我的问题是,有没有理由不使用mmap()?它似乎更简单,内存仍然是共享的,如果我使用MAP_ANON,它不必创建真实的文件。我可以在父进程中创建文件,然后fork()和exec()子进程,并在子进程中使用它。
问题的第二部分是,这种方法不充分的原因是什么,并且必须使用SysV或POSIX共享内存机制?
请注意,我计划使用其他通信所需的管道进行同步,即父级通过管道请求数据,子级将其写入共享内存,并通过管道响应其准备就绪。没有涉及多个读者或作家。便携性不是优先考虑的事项。
答案 0 :(得分:9)
如果您有父/子关系,那么使用mmap就完全没问题了。
sysv_shm是原始的unix实现,它允许相关和不相关的进程共享内存。 posix_shm标准化共享内存。
如果你在没有mmap的posix系统上,你可以使用posix_shm。如果你在没有posix_shm的unix上,你会使用sysv_shm。如果您只需要与父/子共享内存,则可以使用mmap。
答案 1 :(得分:1)
如果内存服务,使用SysV / POSIX而不是mmap
的唯一原因是可移植性。在特别老的Unix系统中,不支持MAP_ANON
。但是,Solaris,Linux,BSD和OS X 做,所以在实践中,没有理由不使用mmap
。
答案 2 :(得分:1)
shm
通常是通过获得/dev/shm
ped的mmap
文件实现的,因此,性能应该相同 - 我会选择mmap
(w / MAP_ANON
和MAP_SHARED
正如你所提到的那样简单,如果我知道可移植性没有问题,就像你说的那样。
答案 3 :(得分:0)
就documentation所知,如果您想使用Xlib / XCB共享内存映像,必须使用SYSV共享内存。< / p>