共享内存与文件的关系

Relationship between shared memory and files

忽略一些细节,Linux 中有两个可用的低级 SHM API。

我们有 旧的(例如System V IPC vs POSIX IPC)SysV 接口使用:

较新的 Posix接口(尽管Posix似乎也标准化了SysV接口):

当使用 shm_open() 时,文件和共享内存段之间似乎存在清晰的一对一映射。 但是,如果您使用 shmget() ,则可以将多个段与单个路径相关联,例如:

key1=ftok(path,1);
key2=ftok(path,2);
shmget(key1,...)
shmget(key2,...)

在这种情况下文件和段之间的关系如果有什么关系呢? 给 ftok 的路径只是一个占位符。我看不出它有什么用。 如果我们将 Unix 哲学视为一切皆文件,那为什么这不是一对一的映射?

独立但相关的问题:

shm_open or shm_get

中没有这样的建议

我只能找到模糊的建议,例如:

我认为 SysV 的线程安全性较低。

在现代应用程序中,您是否更喜欢 SysV(或 posix)?

ftok 的路径只是“一切皆文件”传统中的一个占位符。

经过一段时间考虑,我会说 mmap 更简单、更安全、更有效 API。如果可能的话,我个人会完全避免使用 shmget 等。

shmget()后清理特别尴尬见:

另请参阅:

  • Linux shared memory: shmget() vs mmap()?
  • System V IPC vs POSIX IPC

在其中一个相关问题中支持 system-v 的一个论据是 Posix 的实施范围较小。我不知道那是不是真的,但现在看来更不可能了。鉴于 GNU/Linux 和 BSD 衍生品的主导地位。即使是传说中的 'unique' AIX 现在也声称 Posix 合规。