在这线程中,建议使用mmap()而不是shmget()来获得Linux中的共享内存。为了获得一些文档,我访问了这页面和这页面,但是第二个页面给出了一个关于mmap()的模糊示例。
作为一个新手,并且需要在两个进程之间共享一些信息(以文本形式),我应该使用shmget()方法还是mmap()?为什么?
发布于 2014-01-23 14:48:13
两种方法都是可行的。mmap方法比shmget有一点限制,但更容易使用。shmget是旧的System共享内存模型,具有最广泛的支持。mmap/shm_open是一种新的POSIX实现共享内存的方法,并且更易于使用。如果您的操作系统允许使用POSIX共享内存,那么我建议您这样做。
一些提示:
fork创建您的孩子,那么使用MAP_ANONYMOUS | MAP_SHARED的mmap是目前为止最简单的方法--只打一个电话。然而,MAP_ANONYMOUS是一个Linux扩展POSIX未指明。shm_open (+ ftruncate) +带有MAP_SHARED的mmap是两个/三个调用。需要在某些librt上使用OSes。/dev/shm/,那么shm_open相当于在/dev/shm/中打开一个文件。发布于 2014-01-23 15:32:01
这与历史和未来的方向有很大关系。
很久以前,unix - system和BSD有两个主要版本(而且有些相互竞争)。SysV有自己的IPC版本,包括大的3共享内存、信号量和消息队列。POSIX是来尝试把事情团结起来的。
因此,目前我们有两个版本- posix共享内存,MQs,信号量和sysV版本。为了使事情更加混乱,sysV版本也是posix的一部分。
因此,基本上您的问题是,您想使用Posix还是sysV风格的共享内存?一般来说,大多数人从长远的角度出发,选择Posix,因为这似乎是通向未来的道路。但是,现实地说,sysV是如此的嵌入到这么多的系统中,你必须对它是否会消失抱有严重的怀疑。
所以,消除长期的问题,这取决于对你的项目和你的品味有意义的是什么。一般来说,sysV版本实际上更强大,但它们有一个笨重的界面,大多数人在第一次接触时会感到有些困惑。对于sysV信号量和消息队列尤其如此。就共享内存而言,可以认为sysV和posix都很尴尬。sysV版本带有笨重的ftok和关键内容,而posix最终需要接受多个调用和一些竞争条件来设置。从外部看,posix版本有一个优点,它们利用文件系统,可以使用标准命令行函数(如'rm‘)来维护,而不是依赖于sysV所需的单独实用程序(例如ipcs)。
那你应该用哪一种?作为一项规则,posix版本。但是,您应该真正熟悉sysV版本。它们的一些特性超出了posix版本的功能,您可能希望在特定情况下利用这些功能。
https://stackoverflow.com/questions/21311080
复制相似问题