在此线程中,建议OP在Linux中使用mmap()而不是shmget()来获取共享内存。
我访问了此页面,并获得了一些文档,但是第二个页面给出了一个关于mmap()的晦涩示例。

几乎是新手,并且需要在两个进程之间共享一些信息(以文本形式),我应该使用shmget()方法还是mmap()? 又为什么呢?


两种方法都是可行的。 mmap方法比shmget更具限制性,但更易于使用。 shmget是旧的System V共享内存模型,并且具有最广泛的支持。 mmap / shm_open是执行共享内存的新POSIX方法,更易于使用。如果您的操作系统允许使用POSIX共享内存,那么我建议您这样做。

一些提示:

  • 如果您通过fork创建孩子,那么到目前为止mmapMAP_ANONYMOUS | MAP_SHARED是最简单的方法-只需一个电话。但是,MAP_ANONYMOUS是POSIX未指定的Linux扩展。
  • 如果您独立启动进程,但可以为它们提供共享的内存名称,则shm_open(+ ftruncate)+ mmapMAP_SHARED是两个/三个调用。在某些操作系统上需要librt
  • 如果您的操作系统具有/dev/shm/,则shm_open等效于在/dev/shm/中打开文件。

这在很大程度上与历史和未来方向有关。

曾几何时,有两个主要的(并且有些相互竞争)的unix版本-系统V和BSD。 SysV拥有自己的IPC版本,其中包括3类-共享内存,信号量和消息队列。 POSIX来尝试统一事物。

因此,目前我们有两个版本-posix共享内存,MQ和信号量以及sysV版本。只是为了使事情更加混乱,sysV版本也是posix的一部分。

因此,基本上,您的问题是您要使用Posix还是sysV风格的共享内存?一般而言,大多数人都选择了Posix,因为这似乎是通往未来的道路。但是,实际上,sysV内容是如此嵌入在如此多的系统中,因此您不得不怀疑它是否会消失。

因此,省去了长期的工作,这取决于您的项目和口味。通常,sysV版本实际上实际上更强大,但它们的界面笨拙,大多数人在初次接触时会感到有些困惑。 sysV信号量和消息队列尤其如此。在共享内存方面,可以说sysV和posix都很尴尬。 sysV版本带有笨拙的ftok和关键内容,而posix最终需要进行多次调用和设置一些竞争条件。从外部来看,posix版本的优势在于它们利用文件系统,并且可以使用标准命令行功能(如" rm")进行维护,而不必依赖sysV所需的单独实用程序(例如ipcs)。

那么您应该使用哪个呢?通常,posix版本。但是您应该真正熟悉sysV版本。它们具有某些功能,这些功能超出了posix版本的功能,您可能希望在特定情况下利用这些功能。