Linux共享内存:shmget()vs mmap()?

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

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

BowPark asked 2019-11-17T19:47:33Z
2个解决方案
72 votes

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

一些提示:

  • 如果您通过/dev/shm/创建孩子,那么到目前为止,带有/dev/shm/shm_open/dev/shm/是最简单的方法-只需一个电话。 但是MAP_SHARED是POSIX未指定的Linux扩展。
  • 如果您独立地启动进程,但是可以为其提供共享的内存名称,则/dev/shm/(+ shm_open)+ /dev/shm/MAP_SHARED是两个/三个调用。 在某些操作系统上需要librt
  • 如果您的操作系统具有/dev/shm/,则shm_open等效于在/dev/shm/中打开文件。
Sergey L. answered 2019-11-17T19:48:22Z
36 votes

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

曾几何时,有两个主要的(并且有些相互竞争)的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版本的功能,您可能需要在特定情况下利用这些功能。

Duck answered 2019-11-17T19:49:22Z
translate from https://stackoverflow.com:/questions/21311080/linux-shared-memory-shmget-vs-mmap